本主题讨论 Windows Communication Foundation (WCF) 版本 4.5 中的新增功能。
gRPC 作为 WCF 的替代方法
gRPC 是一种现代 RPC 框架,是 WCF 的常用替代方法。 gRPC 基于 HTTP/2 构建,它比 WCF 提供了许多优势,包括:
- 性能:gRPC 比 WCF 更高效,尤其是对于长时间运行的连接。
- 可伸缩性:gRPC 旨在扩展到大量客户端和服务器。
- 安全性:gRPC 支持各种安全机制,包括 TLS 和身份验证。
- 跨平台:gRPC 是平台中立的,可用于各种编程语言。
有关开发或迁移 WCF 应用到 gRPC 的详细信息,请参阅:
WCF 简化功能
为了简化 WCF 4.5 应用程序的开发和维护,做了大量工作。 有关详细信息,请参阅 WCF 简化功能。
基于任务的异步支持
默认情况下,添加服务引用生成任务返回异步服务操作方法。 这适用于同步和异步方法。 这样,就可以使用基于任务的异步编程模型异步调用服务操作。 调用生成的代理方法时,WCF 将构造一个 Task 对象来表示异步操作,并将该任务返回给你。 任务在操作完成时完成。 实现异步操作时,可以将其实现为基于任务的异步操作。 有关详细信息,请参阅 同步和异步操作。
简化了生成的配置文件
在 Visual Studio 中添加服务引用或使用 SvcUtil.exe 工具时,将生成客户端配置文件。 在早期版本的 WCF 中,这些配置文件包含每个绑定属性的值,即使其值为默认值。 在 WCF 4.5 中,生成的配置文件仅包含那些设置为非默认值的绑定属性。
有关详细信息,请参阅 WCF 简化功能。
协定优先开发
WCF 现在支持协定优先开发。 svcutil.exe 具有 /serviceContract 开关,可用于从 WSDL 文档生成服务和数据协定。
从可移植子集项目添加服务引用
可移植子集项目使 .NET 程序集程序员能够维护单个源树和生成系统,同时仍支持多个 .NET 平台(桌面、Silverlight、Windows Phone 和 Xbox)。 可移植子集项目仅引用 .NET 可移植库,这些库是可以在任何 .NET 平台上使用的程序集。 开发人员体验与在任何其他 WCF 客户端应用程序中添加服务引用相同。 有关详细信息,请参阅 可移植子集项目中的“添加服务引用”。
ASP.NET 兼容性模式默认已更改
WCF 提供 ASP.NET 兼容模式,以在编写 WCF 服务时向开发人员授予对 ASP.NET HTTP 管道中功能的完整访问权限。 若要使用此模式,必须在 web.configaspNetCompatibilityEnabled 节中将 < 属性设置为 true。此外,这个 appDomain 中的任何服务都需要将其 > 属性设置为 或 RequirementsMode。 现在,默认 AspNetCompatibilityRequirementsAttribute 设置为 Allowed. 有关详细信息,请参阅 WCF 服务和 ASP.NET。
新的传输默认值
为了简化配置,已更改许多传输属性默认值。 有关详细信息,请参阅 WCF 简化功能。
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas 包含 XML 字典读取器的可配置配额值,用于限制编码器在创建消息时使用的内存量。 虽然这些配额是可配置的,但默认值已更改为降低开发人员必须显式设置它们的可能性。 有关详细信息,请参阅 WCF 简化功能。
WCF 配置验证
作为 Visual Studio 中生成过程的一部分,WCF 配置文件现在针对项目中定义的属性进行验证。 如果验证失败,则会在 Visual Studio 中显示验证错误或警告的列表。
XML 编辑器工具提示
为了帮助新的和现有的 WCF 服务开发人员配置其服务,Visual Studio XML 编辑器现在为作为服务配置文件一部分的每个配置元素及其属性提供工具提示。
流改进
添加了对真正的异步流式处理的支持,如果接收端不读取或读取速度缓慢,则发送端现在不会阻止线程,从而提高可伸缩性。 删除了客户端向 IIS 托管 WCF 服务发送流式消息时消息缓冲的限制。 有关详细信息,请参阅 WCF 简化功能。
使用 IIS 简化通过 HTTPS 公开终结点的过程
添加了 HTTPS 协议映射,以简化通过 HTTPS 公开终结点。 若要启用 HTTPS 终结点,请确保网站已配置 HTTPS 绑定和 SSL 证书,然后为托管服务的虚拟目录启用 HTTPS。 如果为服务启用了元数据,也会通过 HTTPS 公开元数据。
生成单个 WSDL 文档
某些第三方 WSDL 处理堆栈无法通过 xsd:import 处理依赖于其他文档的 WSDL 文档。 WCF 现在允许指定在单个文档中返回所有 WSDL 信息。 若要请求单个 WSDL 文档,请在从服务请求元数据时将“?singleWSDL”追加到 URI。
WebSocket 支持
WebSocket 是一种技术,通过端口 80 和 443 提供真正的双向通信,其性能特征类似于 TCP。 添加了两个新绑定以支持通过 WebSocket 传输进行通信。 NetHttpBinding 和 NetHttpsBinding。 有关详细信息,请参阅:系统提供的绑定。
新的传输默认值
下表描述了已更改的设置以及查找其他信息的位置。
| 财产 | 开启 | 新建默认值 | 有关详细信息,请参阅 |
|---|---|---|---|
| 信道初始化超时 | NetTcpBinding | 30 秒 | ChannelInitializationTimeout |
| listenBacklog | NetTcpBinding | 12 * 处理器数 | ListenBacklog |
| maxPendingAccepts (最大待接受数) | 面向连接传输绑定元素 SMSvcHost.exe |
2 * 用于传输的处理器数量 4 * SMSvcHost.exe 处理器数 |
MaxPendingAccepts 配置 Net.TCP 端口共享服务 |
| 最大待处理连接数 | 面向连接传输绑定元素 | 12 * 处理器数 | MaxPendingConnections |
| receiveTimeout | SMSvcHost.exe | 30 秒 | 配置 Net.TCP 端口共享服务 |
在代码中配置 WCF 服务
Windows Communication Foundation (WCF) 使开发人员能够使用配置文件或代码配置服务。 当部署之后需要对服务进行配置时,配置文件十分有用。 在使用配置文件时,IT 专业人员只需要更新配置文件,无需重新编译。 不过,配置文件可能十分复杂,难以维护。 不支持对配置文件进行调试,并且将按名称来引用配置元素,这使得配置文件的创作易于出错且较为困难。 通过 WCF,你还可以使用代码来配置服务。 在早期版本的 WCF(4.0 及更早版本)中,使用代码来配置服务在自托管方案中十分简单,通过 ServiceHost 类,可以在调用 ServiceHost.Open 之前配置终结点和行为。 但是,在 Web 托管方案中,你无权访问该 ServiceHost 类。 若要配置 Web 承载的服务,你需要创建 System.ServiceModel.ServiceHostFactory,后者会创建 ServiceHostFactory 并执行任何所需的配置。 从 .NET Framework 4.5 起,WCF 提供了一种使用代码来配置自托管服务和 Web 托管服务的更简单的方法。 有关详细信息,请参阅 在代码中配置 WCF 服务。
ChannelFactory 缓存
WCF 客户端应用程序使用该 ChannelFactory<TChannel> 类创建与 WCF 服务的信道。 创建 ChannelFactory<TChannel> 实例会产生一些开销,因为它涉及以下操作:
构造 ContractDescription 树
反映所有所需的 CLR 类型
构造通道堆栈
资源的释放
为了最大程度地减少此开销,在使用 WCF 客户端代理时,WCF 可以缓存通道工厂。 有关详细信息,请参阅 通道工厂和缓存。
压缩和二进制编码器
从 WCF 4.5 开始,WCF 二进制编码器增加了对压缩的支持。 使用 CompressionFormat 属性配置压缩类型。 客户端和服务都必须配置 CompressionFormat 属性。 压缩适用于 HTTP、HTTPS 和 TCP 协议。 如果客户端指定使用压缩,但服务不支持压缩,则会引发协议异常,指示协议不匹配。 有关详细信息,请参阅 “选择消息编码器”。
UDP
已添加对 UDP 传输的支持,使开发人员能够编写使用“触发和忘记”消息传送的服务。 客户端向服务发送消息,并不期待服务的响应。
多个身份验证支持
在使用 HTTP 传输和传输安全性时,已添加支持以在单个 WCF 终结点上实现 IIS 所支持的多种身份验证模式。 IIS 允许在虚拟目录中启用多个身份验证模式,此功能允许单个 WCF 终结点支持为托管 WCF 服务的虚拟目录启用的多种身份验证模式。
IDN 支持
已增加对使用国际化域名的 WCF 服务的支持。 有关详细信息,请参阅 WCF 和国际化域名。
HttpClient
添加了名为 HttpClient 的新类,使处理 HTTP 请求变得更容易。 有关详细信息,请参阅 HttpClient 和使用 HttpClient 的指南。
配置 IntelliSense
项目中定义的自定义属性的配置文件中的属性值现在支持 IntelliSense,以便快速准确地处理配置。
配置工具提示
WCF 元素和属性现在在 XML 编辑器中具有工具提示,以便更轻松地准确识别元素或属性的用途。
将数据以类形式粘贴
在 WCF 项目中,XML 中定义的数据类型(如在服务中公开)可以直接粘贴到代码页中。 XML 类型将粘贴为 CLR 类型。 有关更多详细信息,请参阅 从 XML 生成数据类型类 。
WebServiceHost 和默认终结点
在 Visual Studio 2010 中,无论是否显式指定终结点,WebServiceHost 都会自动创建默认终结点。 在 Visual Studio 2012 及更高版本中,如果未显式添加终结点,则 WebServiceHost 仅创建默认终结点。 如果客户端需要默认终结点,则可以显式添加终结点并将客户端指向该终结点。 或者,可以通过将以下设置添加到应用程序的配置文件,告知 WCF 还原回以前的行为
<appSettings>
<add key="wcf:webservicehost:enableautomaticendpointscompatability" value="true"/>
</appSettings>
IHttpCookieContainerManager
此接口由 IChannelFactory<TChannel>客户端公开,使得在客户端上使用 Cookie 要容易得多。 当 AllowCookies 在绑定上设置为 true 时,可以使用以下代码访问 Cookie:
IHttpCookieContainerManager cookieManager = factory.GetProperty<IHttpCookieContainerManager>();
System.Net.CookieContainer container = cookieManager.CookieContainer;
然后,您可以在CookieContainer检索或设置 Cookie。 当 AllowCookies 设置为 false 时,可以通过OperationContext手动检索 Cookie,并使用OperationContext或消息检查器将其发送到其他请求中。 IHttpCookieContainerManager 接口允许你使用服务对用户进行身份验证,并使用该服务返回的身份验证 Cookie 对其他服务进行身份验证。