Windows通訊基礎

Windows通訊基礎（Windows Communication Foundation, WCF）是由微軟發展的一組資料通訊的應用程式開發介面，它是.NET框架的一部分，由.NET Framework 3.0開始引入，與Windows Presentation Foundation及 Windows Workflow Foundation並列為新一代Windows作業系統以及WinFX的三個重大應用程式開發類別庫。

在.NET Framework 2.0以及前版本中，微軟發展了Web Service（SOAP with HTTP communication），.NET Remoting（TCP/HTTP/Pipeline communication）以及基礎的Winsock等通訊支援，由於各個通訊方法的設計方法不同，而且彼此之間也有相互的重疊性（例如.NET Remoting可以開發SOAP, HTTP通訊），對於開發人員來說，不同的選擇會有不同的程式設計模型，而且必須要重新學習，讓開發人員在使用時有許多不便。同時，服務導向架構（Service-Oriented Architecture）也開始盛行於軟體工業中，因此微軟重新檢視了這些通訊方法，並設計了一個統一的程式開發模型，對於資料通訊提供了最基本最有彈性的支援，這就是Windows Communication Foundation。

## 概念

WCF由於集合了幾乎由.NET Framework所提供的通訊方法，因此學習曲線比較陡峭，開發人員必須要針對各個部份的內涵做深入的了解，才能夠操控WCF來開發應用程式。

- 通訊雙方的溝通方式，由合約 (Contract)來訂定。
- 通訊雙方所遵循的通訊方法 (communication protocol)，由協定繫結 (Binding)來訂定。
- 通訊期間的安全性，由雙方約定的安全性層次來訂定。

### 合約（Contract）

WCF的基本概念是以合約（Contract）來定義雙方溝通的協定，合約必須要以介面的方式來呈現，而實際的服務程式碼必須要由這些合約介面衍生並實作。合約分成了四種：

- 資料合約（Data Contract），訂定雙方溝通時的資料格式。
- 服務合約（Service Contract），訂定服務的定義。
- 營運合約（Operation Contract），訂定服務提供的方法。
- 訊息合約（Message Contract），訂定在通訊期間覆寫訊息內容的規範。

一個WCF中的合約，就如同下列程式碼所示：

```csharp
using System;
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
  [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] // 服務合約
  public interface ICalculator
  {
    [OperationContract] // 營運合約
    double Add（double n1, double n2）;
    [OperationContract] // 營運合約
    double Subtract（double n1, double n2）;
    [OperationContract] // 營運合約
    double Multiply（double n1, double n2）;
    [OperationContract] // 營運合約
    double Divide（double n1, double n2）;
  }
}
```

### 協定繫結（Binding）

由於WCF支援了HTTP、TCP、命名管道、MSMQ、Peer-To-Peer TCP等協定，而HTTP又分為基本HTTP支援（BasicHttpBinding）以及WS-HTTP支援（WsHttpBinding），而TCP亦支援NetTcpBinding，NetPeerTcpBinding等通訊方式，因此，雙方必須要統一通訊的協定，並且也要在編碼以及格式上要有所一致。

一個設定通訊協定繫結的範例如下：

```xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <!-- 設定服務繫結的資訊 -->
    <services>
      <service name=" CalculatorService" >
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1"
            contract="ICalculator" />
      </service>
    </services>
    <!-- 設定通訊協定繫結的資訊 -->
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
        </binding>
      </wsHttpBinding>
   </bindings>
  </system.serviceModel>
</configuration>
```

雖然WCF也可以使用SOAP做通訊格式，但它和以往的ASP.NET XML Web Services不同，因此有部份技術文章中，會將ASP.NET的XML Web Services稱為ASMX Service。

WCF的服務可以掛載於Console Application，Windows Application，IIS（ASP.NET）Application，Windows Service以及Windows Activation Services中，但大多都會掛在Windows Service。

### 安全性層次

WCF實作上已經支援了傳輸層次安全性（Transport-level security）以及訊息層次安全性（Message-level security）兩種。

- 傳輸層次安全性：在資料傳輸時期加密，例如SSL。
- 訊息層次安全性：在資料處理時就加密，例如使用數位簽章，雜湊或是使用金鑰加密法等。

## 使用者端

對於WCF的使用者端來說，WCF服務就像是一個Web Service一樣，在Visual Studio 2008中，所有WCF服務的連接都是由使用者端的WCF Service Proxy來執行，開發人員不用花費太多心思在通訊上，而WCF Service Proxy在Visual Studio中被稱為服務參考（Service Reference）。

在Visual Studio中加入WCF的服務參考時，Visual Studio會自動幫開發人員做掉一些必要工作（例如組態建立以及產生Service Proxy等），開發人員只需要在程式碼中取用WCF Service Proxy物件即可。

## 參考文獻

- MSDN .NET Framework Developer Center: WCF
- MSDN Library: WCF Portal
- 本文中的範例均來自MSDN Library: WCF Portal中。