WCF 被關注的時間已經很長了,全名 "Windows Communication Foundation",它還有另外一個名字叫 Indigo,這應該是微軟邁向 SOA 一個重要的標誌。對開發者而言,一個統一的模型整合了以往零零碎碎的 WebService、Remoting、MSMQ 等技術,讓分佈式開發變得更加簡單。
SOA 現在很熱鬧,但它早已經出現。最初廠商和網站炒 "WebServices" 的時候,SOA 就已經是個熱門詞彙了。但是在實際開發中,WebServices 和 .NET Remoting 的使用度並不高,原因太多太複雜。不過 WCF 的出現,相信會推進這一進程。
面向服務(SOA, service-oriented application)示意圖
WCF 的架構模型和 .NET Remoting 有些類似,下圖很好地說明了其執行的流程和相關結構。
WCF 架構示意圖
WCF 宿主架構示意圖
作爲一種邊界清晰、中立、高度獨立的開發模型,WCF 幾乎可用於所有的分佈開發模式。
WCF 通訊方式示意圖
(以上圖片均選自《Programming WCF Services》)
幾乎所有的 WCF 的開發文章裏都會提到一個名爲 "ABC" 的說法,分別是 Address、Binding 和 Contract。Address表示服務的地址。比如 "http://localhost:8080/myservice.svc";Binding表示綁定策略。可以爲單個服務添加多個綁定,如內部採取 NetTcpBinding(Binary),外網則採取 WSHttpBinding(Text),當然一個 Binding 也可用於多個服務;Contract表示服務契約。在 SOA 中客戶端和服務器之間並沒有直接的對象繼承和引用關係,雙方通過一種約定的格式來傳遞消息(Message),這種約定就是契約。
在實際開發中,我們往往會將 "ABC" 反過來進行。首先定義及實現契約,然後選擇合適的綁定模式,最後定義服務的地址。在 WCF 中,服務對象不再需要從 MarshalByRefObject 繼承,我們也無需再關心 SAO、CAO 之類的區別,其模式更類似於 ASP.NET WebService,同樣也支持 Session。WCF 更多地使用聲明式編程模式,通過大量的特性(Attribute)來描述服務策略。
public interface ICalculate
{
[OperationContract]
double Add(double a, double b);
}
public class CalculateService : ICalculate
{
public double Add(double a, double b)
{
return a + b;
}
}
除了上面這些,我們還會接觸到 Behavior、Message 等信息。Behavior 用於對服務器進行一些設置,比如開放 WSDL 信息獲取,反饋出錯信息等。MessageContract 則可以自定義通訊消息,包括添加自定義的 Head。
和 Remoting 一樣,我們可以選擇不同的宿主,包括 IIS、WinForm、Windows Service、Console 等。推薦使用配置文件來完成服務器和客戶端設置,但同樣支持編碼方式。WCF 客戶端依然是一個代理對象,這個代理類型的代碼一般由 Svcutil.exe 工具來生成。