Justin Smith在MSDN雜志上發表了文章《使用 WCF 和 .NET Framework 3.5 進行 HTTP 編程》,暢談了WCF 3.5對於HTTP編程的改進。以下幾點值得關注:
.NET Framework 3.5 中的 WCF 構建於 .NET Framework 3.0 的擴展點 之上,從而為構建符合 Web 原則的服務提供一流的支持。它包含一個易於使用 的 HTTP 編程模型、JavaScript Object Notation (JSON) 消息傳遞功能,以及 新的整合 API,使創建和使用整合的內容變得非常簡便。憑借此功能集,WCF 現 已成為將服務連接到 Web 客戶端的首選服務平台,不論這些客戶端是 ASP.NET AJAX 控件、SilverlightTM 客戶端,還是浏覽器。
應該說,這對於微軟 的SOA戰略來講,是一個非常有力的改進與增強。如何將原有的BS系統、富客戶 端與服務進行通信,提供服務和消費服務,對於一個企業要實現SOA解決方案來 講,始終是一件彌足輕重的任務。可以說,WCF 3.5提供的簡潔的HTTP編程模型 ,彌補了這一缺點。
使 .NET Framework 3.5 中的 WCF 如此引人注目的 特色之一是,以 Web 為中心的通信與 SOAP 和 WS-* 標准組合到了一個服務堆 棧和對象模型中。這意味著您可以構建這樣一個服務,即采用 SOAP 和 WS-* 在 企業內部或跨企業邊界進行通信,同時還可以將同一服務配置為使用 Web 協議 與外部通信。
這是多麼讓人愉快的選擇!這意味著對於同一個服務,面 對不同的場景,我們可以選擇不同的協議完成與客戶端的通信。尤其是WCF支持 基於TCP傳遞SOAP/WS-*消息,而一直以來,WCF到WCF之間采用二進制形式的消息 傳遞,使得我們可以構建更加快速的企業內部網,實現企業信息化的高效與穩定 。
WCF對於REST的支持已經到了空前強大的地步。使用WCF的REST模式, 可以發送POX(Plain Old XML)消息或者使用聯合(Syndication)格式。WCF 3.5專門提供了WebHttpBinding,WebHttpBehavior,以及關於HTTP動作的特性, 例如WebGetAttribute和WebInvokeAttribute。其中,WebGetAttribute對應HTTP 的GET動作,而WebInvokeAttribute則可以被除HTTP GET之外的動作所使用。例 如:
[ServiceContract]
public interface IPictureService
{
[OperationContract]
[WebGet (UriTemplate = "picture/{pictureId}")]
Stream GetPicture(String pictureId);
[OperationContract]
[WebGet(UriTemplate = "picture/t/{pictureId}")]
Stream GetPictureThumbnail(String pictureId);
[OperationContract]
[WebInvoke(UriTemplate="update", Method="POST")]
void UpdatePictureInfo(PictureInfo info);
}
為了支持對應的客戶端代理的創建,WCF 3.5還增 加了一個工廠類WebServiceHostFactory以及宿主類WebServiceHost,前者繼承 於ServiceHostFactory類,後者則繼承自ServiceHost類。
WebServiceHostFactory 類型適用於 IIS 承載的情形,這樣就不需要命 令性或配置文件承載信息。.NET Framework 3.0 中的 WCF 引入了 .svc 文件, 作為在 IIS 中承載 WCF 服務的激活目標。這些文件包含了一些指令,類似於 ASP.NET 中的頁面指令。將 WebServiceHostFactory 添加到 .svc 文件指令的 Factory 屬性會創建一個 ServiceHost、添加一個終結點(與 WebHttpBinding 使用適當的約定)、將 WebHttpBehavior 添加到該終結點,然後打開 ServiceHost:<%@ ServiceHost
Language="C#"
Service="PictureService"
Factory="System.ServiceModel.Web.WebServiceHostFactory" %>
服務的 web.config 文件不包含任何與 WCF 相關的條目。
通過WCF 3.5增加的對Syndication的支持,可以非常方便的創建RSS或 ATOM源。文中寫道:
.NET Framework 3.5 充分支持整合內容的創建和使 用。它支持 RSS 2.0 和 ATOM 1.0 格式的創建及使用、支持添加整合擴展的各 種方式,甚至還支持實現其他格式的功能。編程模型避免了開發人員直接處理整 合格式細節,從而使其易於使用。
雖然新的整合功能由 WCF 小組編寫, 但它並不依賴於 WCF。事實上,所有與整合相關的類型都是 System.Syndication 命名空間的一部分,雖然它們位於 System.ServiceModel.Web.dll 程序集中。您可以從任何承載了 AppDomain (ASP.NET、WPF 應用程序、NT 服務等)的進程使用 .NET Framework 3.5 的整 合功能。這個功能意味著您可以通過任何傳輸(而不僅僅是 HTTP)提供或使用 整合的內容。然而,當與 WCF 中的 HTTP 編程模型結合後,也可以將整合添加 到現有的 SOAP/WS-* 服務中。
如下代碼演示了如何檢索一個 ATOM 1.0 源、將其轉換為 RSS 2.0,然後將新的 RSS 表示輸出到控制台:
// read an ATOM feed
Uri feedUri = new Uri ("http://blogs.msdn.com/justinjsmith/atom.xml");
SyndicationFeed feed = SyndicationFeed.Load(feedUri);
// transform it to RSS
Rss20FeedFormatter formatter = new Rss20FeedFormatter(feed);
XmlWriter writer = XmlWriter.Create (Console.Out, null);
// write it to the Console
formatter.WriteTo(writer);
writer.Flush();