Windows Communication Foundation 中的新增功能

本主题讨论 Windows Communication Foundation (WCF) 中的新增功能。

基于配置的激活

在 Internet 信息服务 (IIS) 或 Windows 进程激活服务 (WAS) 下承载 Windows Communication Foundation (WCF) 服务时,通常必须提供 .svc 文件。.svc 文件包含该服务的名称以及可选的自定义服务主机工厂。此附加文件将增加可管理性开销。基于配置的激活功能不要求具有 .svc 文件,因此不会有相关开销。有关更多信息,请参见 IIS 和 WAS 中的基于配置的激活, 基于配置的激活.

System.Web.Routing 集成

在 IIS 中承载 Windows Communication Foundation (WCF) 服务时,请将一个 .svc 文件放入虚拟目录。此 .svc 文件指定所用的服务主机工厂以及实现服务的类。对服务发出请求时,在 URI 中指定 .svc 文件,例如 https://contoso.com/EmployeeServce.svc。对于编写 REST 服务的程序员,此类型的 URI 并非最佳选择。REST 服务的 URI 指定了特定资源,通常没有任何扩展。通过 System.Web.Routing 集成功能,可以承载对无扩展的 URI 做出响应的 WCF 服务。有关更多信息,请参见 System.Web.Routing 集成, SystemWebRouting 集成示例.

多个 IIS 站点绑定支持

在 Internet Information Services (IIS) 7.0 下承载 Windows Communication Foundation (WCF) 服务时,可能需要在同一站点上提供使用相同协议的多个基址。这使得同一服务可以响应多个不同的 URI。在需要承载侦听 https://www.contoso.comhttps://contoso.com 的服务时,此功能非常有用。若要创建针对内部用户和外部用户使用不同基址的服务,此功能也非常有用。有关更多信息,请参见 支持多个 IIS 站点绑定,

路由服务

路由服务是充当消息路由器的泛型 SOAP 中介。路由服务的核心功能是基于消息内容来路由消息,通过该功能,可基于消息本身(标头或消息正文)中的值将消息转发到客户端终结点。有关更多信息,请参见 路由, 路由服务 .

WS-Discovery 支持

通过服务发现功能,客户端应用程序可以使用 WS-Discovery 以互操作方式在运行时动态发现服务地址。WS-Discovery 规范概述了多播(临时)和单播(利用网络资源)执行轻型服务发现所需的消息交换模式 (MEP)。有关更多信息,请参见 WCF Discovery, 发现(示例).

标准终结点

标准终结点是一种预定义的终结点,它的一个或多个属性(地址、绑定和协定)已经固定。例如,所有元数据交换终结点都指定 IMetadataExchange 作为其协定,因此开发人员不必再指定协定。因此,标准 MEX 终结点具有固定的 IMetadataExchange 协定。有关更多信息,请参见 标准终结点, .

工作流服务

通过引入一组消息传递活动,与以前相比,可更容易地实现发送和接收数据的工作流。通过使用这些消息传递活动,您可以对不属于传统发送/接收或 RPC 样式方法调用的复杂消息交换模式进行建模。有关更多信息,请参见 工作流服务, Services, Services.

目标框架特性

目标框架特性用于指定在 IIS 或 WAS 中承载的应用程序所面向的 .NET Framework 的版本。通过该特性,您可以使用 Visual Studio 生成面向 .NET Framework 2.0、3.5 或 4 的应用程序。该特性在应用程序的 Web.config 文件的 <compilation> 标记中设置,如下面的示例所示。

<compilation debug="false"
        targetFramework="4.0">

        <assemblies>
          <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
          <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
          <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        </assemblies>

      </compilation>

如果未安装在 IIS 或 WAS 中承载的应用程序所面向的 .NET Framework 版本,将引发指示问题的异常。如果应用程序的 Web.config 文件中未指定目标 Framework 名字对象,将从在 IIS 中配置的应用程序池版本推断该值。

由于存在此新功能,因此,如果您尝试在运行 .NET Framework 4 的计算机上承载使用 .NET Framework 3.5 编写的 WCF 服务,可能会得到 ProtocolException,并返回下面的文本:

未经处理的异常: System.ServiceModel.ProtocolException: 响应消息的内容类型 text/html; charset=utf-8 与绑定(application/soap+xml; charset=utf-8)的内容类型不匹配。如果使用自定义编码器,请确保正确实现 IsContentTypeSupported 方法。响应的前 1024 个字节为: <html>    <head>        <title>应用程序域或应用程序池当前运行的是 .NET Framework 4 或更高版本。如果此 Web 应用程序的 IIS 设置已设置为 4.0 或更高版本,或者您使用的是 ASP.NET Web Development Server 4.0 或更高版本,则可能会发生此情况。此 Web 应用程序的 Web.config 文件中的 &lt;compilation&gt; 元素不包含此版本的 .NET Framework 所需的“targetFrameworkMoniker”特性(例如,“&lt;compilation targetFrameworkMoniker=&quot;.NETFramework,Version=v4.0&quot;&gt;”)。请更新具有此特性的 Web.config 文件,或者将 Web 应用程序配置为使用其他版本的 .NET Framework。</title>...

出现此错误的原因是,运行 IIS 的应用程序域正在运行 .NET Framework 4 且 WCF 服务应在 .NET Framework 3.5 下运行。有关如何解决此问题的更多信息,请参见如何:在 .NET Framework 4 环境下运行的 IIS 中承载使用 .NET Framework 3.5 编写的 WCF 服务

WCF REST

缓存

通过 .NET Framework 4,您可以利用已在 WCF REST 服务的 ASP.NET 中提供的声明性缓存机制。这样,您可以缓存来自 WCF REST 服务操作的响应。如果用户向配置为进行缓存的服务发送了 HTTP GET,ASP.NET 将发送回已缓存的响应且不会调用服务方法。在缓存过期后,下次用户发送 HTTP GET 时,将会调用服务方法且再次缓存响应。

通过 .NET Framework 4,您还可以实现条件 HTTP GET 缓存。在 REST 方案中,条件 HTTP GET 通常由服务用来实现智能 HTTP 缓存,如 HTTP 规范(可能为英文网页)中所述。有关更多信息,请参见 对 WCF Web HTTP 服务的缓存支持, Caching and Automatic Help Page.

格式支持

通过 WCF Web HTTP 编程模型,可以动态确定服务操作返回其响应所采用的最佳格式。可以根据 Accept 标头自动设置 XML 和 JSON 的响应。通过新增的帮助器 API,能够以编程方式设置操作的格式。有关更多信息,请参见 WCF Web HTTP 格式设置, 自动格式选择, 高级格式选择.

HTTP REST 错误处理

WCF Web HTTP 错误处理可用于从指定 HTTP 状态代码的 WCF REST 服务返回错误,并且使用与操作相同的格式(例如,XML 或 JSON)来返回错误详细信息。有关更多信息,请参见 WCF Web HTTP 错误处理, .

部署功能

运行服务所需的配置已得到简化,并且引入了新的标准终结点以进一步简化服务配置。有关新的简化配置的更多信息,请参见简化配置。有关标准终结点的更多信息,请参见标准终结点

在 IIS 中承载 Windows Communication Foundation (WCF) 服务时,将 .svc 文件放入虚拟目录中。此 .svc 文件指定所用的服务主机工厂以及实现服务的类。对服务发出请求时,在 URI 中指定 .svc 文件,例如 https://contoso.com/EmployeeServce.svc。对于编写 REST 服务的程序员,此类型的 URI 并非最佳选择。REST 服务的 URI 指定了特定资源,通常没有任何扩展。System.Web.Routing 集成功能可用于承载对无扩展的 URI 做出响应的 WCF REST 服务。有关更多信息,请参见 System.Web.Routing 集成.

跨域 JavaScript

JSON Padding (JSONP) 是一种在 Web 浏览器中启用跨站点脚本支持的机制。JSONP 是围绕 Web 浏览器的功能而设计的,用于从检索当前所加载文档的站点之外的站点加载脚本。该机制的工作原理是使用用户定义的回调函数名来填充 JSON 负载,例如:

callback({ “a” = \“b\” });

在上面的示例中,JSON 负载 {“a” = \”b\”} 包装在函数调用 callback 中。必须已在当前网页中定义回调函数。JSONP 响应的内容类型是“application/javascript”。有关更多信息,请参见 JSONP.

WCF REST 服务帮助页

.NET Framework 版本 4 提供了 WCF REST 服务的自动帮助页。此帮助页列出了每个操作的说明、请求和响应格式以及架构。有关更多信息,请参见 WCF Web HTTP 服务帮助页, Caching and Automatic Help Page.