WCF是微軟實現其在過去五年與業界夥伴共同開發的所有Web服務標準的機制,它有望實現廣泛的互通性,適用於諸多平台、運行時環境和程式設計語言。
WCF(Windows
Communications Foundation,原先稱為Indigo)是微軟的下一代編程平台和Runtime系統,用於構建、配置及部署網路分布式服務。它與WCF 運行時環境及代表其主要編程介面的System.ServiceModel命名空間等有關產品一起為分布式系統提供支援人員。
為什麼需要WCF
當前的分布式系統技術是無數成功的應用程式的基礎,其中最主要的是ASP.NET Web服務(ASMX)、增強Web服務(WSE)擴充、微軟訊息佇列(MSMQ)、企業服務/COM+Runtime環境以及.NET Remoting。那麼,這些技術是否存在著什麼重大缺陷從而使得微軟把它們統統換掉呢?沒有,惟一的問題就是這些技術太多了。
使用ASMX和WSE,你就可以藉助支援跨平台協同操作的Web服務和Web服務客戶程式,構建功能強大、協同操作的面向服務的應用程式,並且可以通過鬆散耦合,構建相對簡單的服務和版本控制策略。利用MSMQ,你就有了一種功能強大的機制,可以獲得可擴充、耐用、靈活的隊列訊息,負責把資料從一個地方可靠地傳送到另一個地方。企業服務提供了在分布式環境下執行相關工作的多方整合事務的功能; 允許限制對有限、共用資源的訪問; 允許集中對象執行個體,從而最佳化對初始化成本高昂的資源的訪問; 在事件方面擁有發布/訂閱機制; 擁有豐富的安全模型,而且建立在成熟、平台整合、安全和快速的傳輸機制上。最後但並非最不重要的一點是,Remoting是通用語言運行時環境(CLR)整合機制,用於跨應用域邊界與對象進行通訊,因為非常靈活的擴充模型而備受歡迎,這讓開發人員可以淘汰與取代傳輸機制、代理機制以及通訊通道的工作方式。
所有這些都好,惟一的問題就是,你往往要為到底該使用其中的哪項根本性技術進行選擇。如果你需要企業服務的任何特性,並且決定使用它,那麼你的實現策略會與你使用ASMX時大不相同。如果你需要非常可靠的訊息傳送功能,並決定通過MSMQ發送訊息,而不是通過普通HTTP發送訊息,那麼你的代碼會與通過面向方法的代理調用截然不同,除非你自己添加了一些銜接代碼(plumbing code),或者使用企業服務的隊列組件(Queued Components)特性(這又出現了前面所述的缺點)。
WCF的目標就是,你再也不必事先做出這樣的技術選擇,你可以在單一技術平台上滿足任何組合的這類要求,沒有任何阻礙,這個平台就是WCF。如果你想使用支援會話和事務流的可靠通訊機制來構建Web服務,並且可以擴充該服務,以便能夠檢查進入系統的原始訊息,那麼使用WCF就非常容易做到這一點。雖然如今完成這項任務(而這不僅僅針對微軟平台)並非完全不可能,但要求開發人員對所有上述技術掌握豐富的系統級背景知識,而且需要相當長的開發時間。
WCF的價值在於,它可望提高開發人員的生產力,因為他們只要掌握一種編程模型,這種編程模型整合了ASMX、WSE、企業服務、MSMQ和Remoting的豐富特性。另外別忘了這一點: WCF是微軟實現其在過去五年與業界夥伴共同開發的所有這些Web服務標準的機制——這有望確保廣泛的互通性,適用於諸多平台、運行時環境和程式設計語言。
WCF的ABC
“ABC”是理解WCF的秘訣,“ABC”也是理解WCF服務端點(endpoint)如何組合的關鍵所在。
● A代表位置(Address): 服務在哪裡?
● B代表綁定(Binding): 我如何與該服務聯絡?
● C代表契約(Contract): 該服務能為我做什嗎?
對Web服務描述語言(WSDL)很瞭解的Web服務愛好者很容易看出這三個概念對應WSDL的三個抽象層。
● A代表位置(Address)——用WSDL:Service部分表示,負責把WSDL:Binding串連到具體的服務端點位置。
● B代表綁定(Binding)——用WSDL:Binding部分表示,負責把WSDL:PortType契約描述綁定到實際傳輸機制、信封格式及相關策略上。
● C代表契約(Contract)——用WSDL:PortType、WSDL:Message和WSDL:Type部分表示,描述了類型、訊息、訊息交換模式及操作。
“ABC”還意味著編寫(及配置)WCF服務總是涉及三個步驟:
1. 定義契約,並實現在服務中。
2. 選擇或者定義一種服務綁定,它選擇了傳輸機制以及服務品質、安全及其他選項。
3. 可以通過把契約綁定(使用綁定定義,由此得名)到網路地址上,來部署針對該契約的端點。
值得一提的是,這三個元素相互獨立。一個契約可以支援多個綁定,而一個綁定也可以支援多個契約。一個服務可以同時有多個端點(契約與位置綁定在一起)共存、可以使用。所以,如果你希望通過HTTP呈現服務,並使用SOAP 1.1以獲得最大的互通性,還希望通過TCP,使用二進位編碼來呈現服務,以獲得最高效能,這時出現的兩個端點可以在同一個服務上面共存。
當然,不是所有的綁定都能滿足某個特定服務契約或者服務實現的要求。譬如說,如果某服務確實絕對離不開某些安全方面、可靠訊息傳送、事務流或其他特性,它可以要求: 用於呈現端點的任何綁定必須支援它們。如果綁定不支援所要求的特性,WCF運行時環境會檢測出效能不匹配,並拒絕提供服務。