本主题讨论使编写 WCF 应用程序更简单的新功能。
gRPC 作为 WCF 的替代方法
gRPC 是一种现代 RPC 框架,是 WCF 的常用替代方法。 gRPC 基于 HTTP/2 构建,它比 WCF 提供了许多优势,包括:
- 性能:gRPC 比 WCF 更高效,尤其是对于长时间运行的连接。
- 可伸缩性:gRPC 旨在扩展到大量客户端和服务器。
- 安全性:gRPC 支持各种安全机制,包括 TLS 和身份验证。
- 跨平台:gRPC 是平台中立的,可用于各种编程语言。
有关开发或迁移 WCF 应用到 gRPC 的详细信息,请参阅:
简化了生成的配置文件
在 Visual Studio 中添加服务引用或使用 SvcUtil.exe 工具时,将生成客户端配置文件。 在早期版本的 WCF 中,这些配置文件包含每个绑定属性的值,即使其值为默认值。 在 WCF 4.5 中,生成的配置文件仅包含那些设置为非默认值的绑定属性。
下面是 WCF 3.0 生成的配置文件示例。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
下面是 WCF 4.5 生成的相同配置文件的示例。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
协定优先开发
WCF 现在支持协定优先开发。 svcutil.exe 工具具有 /serviceContract 开关,可用于从 WSDL 文档生成服务和数据协定。
从可移植子集项目中添加服务引用
可移植子集项目使 .NET 程序集程序员能够维护单个源树和生成系统,同时仍支持多个 .NET 实现(桌面、Silverlight、Windows Phone 和 Xbox)。 可移植子集项目仅引用 .NET 可移植库,这些库是可用于任何 .NET 实现的程序集。 开发人员体验与在任何其他 WCF 客户端应用程序中添加服务引用相同。 有关详细信息,请参阅 可移植子集项目中的“添加服务引用”。
ASP.NET 兼容性模式默认已更改
WCF 提供 ASP.NET 兼容模式,以在编写 WCF 服务时向开发人员授予对 ASP.NET HTTP 管道中功能的完整访问权限。 若要使用此模式,必须在 web.config> 节中将 属性设置为 true。此外,这个 appDomain 中的任何服务都需要将其 RequirementsMode
属性设置为 AspNetCompatibilityRequirementsAttribute 或 Allowed。 默认情况下,AspNetCompatibilityRequirementsAttribute 现在设置为 Allowed,并且默认的 WCF 服务应用程序模板将 aspNetCompatibilityEnabled
属性设置为 true
。 有关详细信息,请参阅 Windows Communication Foundation 4.5 和 WCF 服务和 ASP.NET 中的新增功能。
流改进
WCF 现在新增了对异步流式处理的支持。 若要启用异步流,请将 DispatcherSynchronizationBehavior 终结点行为添加到服务主机,并将其 AsynchronousSendEnabled 属性设置为
true
。 当服务向多个正在缓慢读取的客户端发送流式传输消息时,这可以提升服务的可伸缩性。 WCF 不再为每个客户端阻塞一个线程,而是将线程释放出来服务其他客户端。删除了IIS承载服务时对消息缓冲的限制。 在早期版本的 WCF 中,当收到使用流式传输消息的 IIS 托管服务的消息时,ASP.NET 会在将消息发送到 WCF 之前缓冲整个消息。 这会导致占用大量内存。 此缓冲已在 .NET Framework 4.5 中删除,现在 IIS 托管的 WCF 服务可以在收到整个消息之前开始处理传入流,从而启用真正的流式处理。 这允许 WCF 立即响应消息,并提高性能。 此外,不再需要为传入请求指定 ASP.NET 大小限制的值
maxRequestLength
。 如果设置了此属性,则忽略此属性。 有关maxRequestLength
的详细信息,请参阅<httpRuntime>配置元素。 仍需要配置 maxAllowedContentLength,有关详细信息,请参阅 IIS 请求限制。
新的传输默认值
下表描述了已更改的设置以及查找其他信息的位置。
资产 | 上 | 新建默认值 | 详细信息 |
---|---|---|---|
channelInitializationTimeout | NetTcpBinding | 30 秒 | 此属性确定 TCP 连接可以使用 .NET 框架协议对自身进行身份验证需要多长时间。 客户端需要先发送一些初始数据,然后服务器才有足够的信息来执行身份验证。 此超时被有意设置为小于 ReceiveTimeout(10 分钟),这样,未经身份验证的恶意客户端就无法长时间保持绑到该服务器的连接。 默认值为 30 秒。 有关 ChannelInitializationTimeout 的详细信息 |
listenBacklog | NetTcpBinding | 16 * 处理器数 | 此套接字级别的属性描述了要排队的“挂起接受”请求的数目。 如果侦听积压工作 (backlog) 队列已满,则会拒绝新的套接字请求。 有关 ListenBacklog 的详细信息 |
maxPendingAccepts (最大待接受数) | ConnectionOrientedTransportBindingElement SMSvcHost.exe |
2 * 用于传输的处理器数量 4 * SMSvcHost.exe 处理器数 |
此属性会限制服务器可具有的等待侦听器的通道数目。 当 MaxPendingAccepts 太低时,会有一个较小的时间间隔,在此间隔内,所有等待的通道都已开始服务连接,但没有新通道已开始侦听。 连接可在此间隔内到达,但将会因服务器上没有等待它的内容而失败。 可以通过将 MaxPendingConnections 属性设置为更大的数字来配置此属性。 有关详细信息,请参阅 MaxPendingAccepts 并 配置 Net.TCP 端口共享服务 |
最大待处理连接数 | ConnectionOrientedTransportBindingElement | 12 * 处理器数 | 此属性控制一个传输已接受但 ServiceModel 调度程序尚未选取的连接的数目。 若要设置此值,请对绑定使用MaxConnections 或对绑定元素使用maxOutboundConnectionsPerEndpoint 。 有关 MaxPendingConnections 的详细信息 |
receiveTimeout | SMSvcHost.exe | 30 秒 | 此属性为读取 TCP 组帧数据并执行来自基础连接的连接调度指定超时值。 这个机制存在,旨在为 SMSvcHost.exe 服务参与时间设定上限,以读取来自传入连接的前导数据。 有关详细信息,请参阅 配置 Net.TCP 端口共享服务。 |
注释
仅当在具有 .NET Framework 4.5 的计算机上部署 WCF 服务时,才会使用这些新默认值。 如果在使用 .NET Framework 4.0 的计算机上部署相同的服务,则使用 .NET Framework 4.0 默认值。 在这种情况下,建议显式配置这些设置。
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas 包含 XML 字典读取器的可配置配额值,用于限制编码器在创建消息时使用的内存量。 虽然这些配额是可配置的,但默认值已更改为降低开发人员需要显式设置它们的可能性。
MaxReceivedMessageSize
配额尚未更改,因此仍可限制内存消耗,避免您不得不处理XmlDictionaryReaderQuotas的复杂性。 下表显示了配额、其新默认值以及每个配额的用途的简要说明。
配额名称 | 默认值 | DESCRIPTION |
---|---|---|
MaxArrayLength | Int32.MaxValue | 获取和设置允许的最大数组长度。 此配额限制 XML 读取器返回的基元数组的最大大小,包括字节数组。 此配额不会限制 XML 读取器本身的内存消耗,而是限制使用读取器的任何组件。 例如,当DataContractSerializer使用受MaxArrayLength保护的读取器时,它不会反序列化大于此配额的字节数组。 |
MaxBytesPerRead | Int32.MaxValue | 获取和设置每个读取返回的最大允许字节数。 此配额限制读取元素开始标记及其属性时在单个读取作中读取的字节数。 (在非流式处理的情况下,元素名称本身不计入配额)。 具有过多的 XML 属性可能会占用不成比例的处理时间,因为必须检查属性名称的唯一性。 MaxBytesPerRead 可缓解这一威胁。 |
MaxDepth | 节点深度为 128 | 此配额限制 XML 元素的最大嵌套深度。 MaxDepth 与 MaxBytesPerRead 交互时:读取器始终将数据保留在当前元素及其所有祖先的内存中,因此读取器的最大内存消耗与这两个设置的乘积成比例。 当反序列化深度嵌套的对象图时,会迫使反序列化程序访问整个堆栈并引发一个不可恢复的 StackOverflowException。 XML 嵌套和对象嵌套DataContractSerializerXmlSerializer之间存在直接关联。 MaxDepth 用于缓解此威胁。 |
MaxNameTableCharCount | Int32.MaxValue | 此配额限制名称表中允许的最大字符数。 nametable 包含处理 XML 文档时遇到的某些字符串(如命名空间和前缀)。 由于这些字符串在内存中缓冲,因此此配额用于防止预期流式处理时过度缓冲。 |
MaxStringContentLength | Int32.MaxValue | 此配额限制 XML 读取器返回的最大字符串大小。 此配额不会限制 XML 读取器本身的内存消耗,而是限制正在使用读取器的组件的内存消耗。 例如,当DataContractSerializer使用受保护的MaxStringContentLength读取器时,它不会反序列化大于此配额的字符串。 |
重要
有关保护数据的详细信息,请参阅 数据安全注意事项 下的“安全使用 XML”。
注释
仅当在具有 .NET Framework 4.5 的计算机上部署 WCF 服务时,才会使用这些新默认值。 如果在使用 .NET Framework 4.0 的计算机上部署相同的服务,则使用 .NET Framework 4.0 默认值。 在这种情况下,建议显式配置这些设置。
WCF 配置验证
作为 Visual Studio 中生成过程的一部分,WCF 配置文件现已得到验证。 如果验证失败,则会在 Visual Studio 中显示验证错误或警告的列表。
XML 编辑器工具提示
为了帮助新的和现有的 WCF 服务开发人员配置其服务,Visual Studio XML 编辑器现在为作为服务配置文件一部分的每个配置元素及其属性提供工具提示。
BasicHttpBinding 改进
使单个 WCF 终结点能够响应不同的身份验证模式。
允许由 IIS 控制 WCF 服务的安全设置