技术开发 频道

使用WCF和.NET 3.5 进行HTTP编程

  绑定和承载

  至此,您已了解如何将 URI 段映射到应用程序功能、如何将操作映射到 HTTP 动词,以及如何与 HTTP 标头交互。现在,让我们来看看如何将这些功能整合到一个运行的服务中去。为此,您需要先了解 WCF 中更多的新类型。

  .NET Framework 3.0 中的 WCF 引入了绑定这个概念,即对传输和终结点协议的一种抽象。.NET Framework 3.0 附带了多种绑定,支持各种传输和协议选择。

  .NET Framework 3.5 中的 WCF 包含一种新的绑定,名为 System.ServiceModel.WebHttpBinding。这种绑定是对 Web 原则的抽象,它所遵循的使用模型与 .NET Framework 3.0 中的绑定类型相同,因此可以像其他绑定一样将其添加到终结点。

  .NET Framework 3.0 中的 WCF 还引入了终结点行为这个概念。行为是一种扩展消息传递基础结构执行路径的方式。.NET Framework 附带了多种行为,要自己创建行为也十分容易。

  .NET Framework 3.5 中的 WCF 包含了一种新的终结点行为,名为 System.ServiceModel.Description.WebHttpBehavior。此行为可以执行多种任务。对于接收应用程序而言,它的任务之一是设置筛选基础结构,以确保将收到的消息分派到服务对象上相应的方法。在 .NET Framework 3.0 中,WCF 使用 SOAP Action 和目标地址的组合作为调度键。WebHttpBehavior 设置的筛选机制是对现有筛选机制的一种扩展,目的是使用 UriTemplate 匹配和 HTTP 动词。

  图 4
显示了如何使用 WebHttpBinding 和 WebHttpBehavior 来构建利用 Web 原则的接收应用程序。这种方法的优点是,您可以将这些终结点之一添加到现有的 ServiceHost 中,这样您最终将得到一个 ServiceHost,它不仅有 SOAP/WS-* 终结点,同时也有 REST 终结点。

Figure 4 Using WebHttpBinding and WebHttpBehavior

ServiceHost host = new ServiceHost(typeof(IPictureContract),
    
new Uri("http://localhost:5000"));
// instantiate a WebHttpBinding
WebHttpBinding binding = new WebHttpBinding();

// add an endpoint, using the WebHttpBinding
ServiceEndpoint ep = host.AddServiceEndpoint(
    
typeof(IPictureContract),  binding, String.Empty);

// add the WebHttpBehavior to the endpoint
ep.Behaviors.Add(new WebHttpBehavior());

// open the ServiceHost to start listening
host.Open();

  发送应用程序遵循相同的使用模型,但应将 WebHttpBehavior 添加到 ChannelFactory<T> 对象上的终结点行为集合中。根据典型的 WCF 惯例,也可以在配置文件中使用这些选项。

  .NET Framework 3.5 中的 WCF 使得这个模型更加容易使用,在某些情况下,您无需添加 WebHttpBinding 或 WebHttpBehavior。新的 API 包含了两种类型以实现此目的:System.ServiceModel.Web.WebServiceHost 和 System.ServiceModel.Web.WebServiceHostFactory。WebServiceHost 类型可以自动将 WebHttpBehavior 添加到所有终结点,并在运行时执行一些额外的验证,以确保所有的终结点都与该行为兼容。这就省去了将 WebHttpBehavior 添加到终结点这个步骤。

  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 相关的条目。
0
相关文章