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类。