控制资源消耗并提高性能

本主题介绍 Windows Communication Foundation (WCF) 体系结构的不同区域中的各种属性,这些属性可用于控制资源消耗并影响性能指标。

在 WCF 中限制资源消耗的属性

Windows Communication Foundation (WCF)针对某些类型的进程应用约束,以实现安全或性能目的。 这些约束有两种主要形式,即:配额和控制器。 配额是一种限制,当达到或超过此限制时,将立即在系统中的某个点触发异常。 控制器也是一种限制,但不会立即导致引发异常。 相反,当达到节流限制时,处理会在所设置的节流值范围内继续进行。 这种有限的处理可能会在其他位置触发异常,但这取决于应用程序。

除了配额与控制器之间存在区别之外,序列化级别、传输级别以及应用程序级别中也分别存在一些约束属性。 例如,默认情况下,由所有系统提供的传输绑定元素实现的配额 TransportBindingElement.MaxReceivedMessageSize设置为 65,536 字节,以阻止恶意客户端对服务进行拒绝服务攻击,从而导致内存消耗过多。 (通常,可以通过降低此值来提高性能。

序列化配额的示例是 DataContractSerializer.MaxItemsInObjectGraph 属性,该属性指定序列化程序在单个 ReadObject 方法调用中序列化或反序列化的最大对象数。 应用级限流的一个示例是 ServiceThrottle.MaxConcurrentSessions 属性,该属性默认最大并发会话通道连接数为 10。 (与配额不同,如果达到此限制值,应用程序将继续处理,但不接受新的会话通道,这意味着新客户端在结束其他会话通道之一之前无法连接。

这些控件旨在针对某些类型的攻击提供现成缓解措施,或改进性能指标,例如内存占用、启动时间等。 但是,根据应用程序,这些控制可能会妨碍服务应用程序性能或阻止应用程序完全工作。 例如,设计为流式传输视频的应用程序可以轻松超过默认 TransportBindingElement.MaxReceivedMessageSize 属性。 本主题概述了应用于 WCF 各个级别的应用程序的各种控件,介绍了获取有关设置是否阻碍应用程序的详细信息的各种方法,并介绍了更正各种问题的方法。 大多数流量限制和某些配额可以在应用程序级别使用,尽管基属性是序列化或传输约束。 例如,可使用 Service 类的 DataContractSerializer.MaxItemsInObjectGraph 属性来设置 ServiceBehaviorAttribute.MaxItemsInObjectGraph 属性。

注释

如果遇到特定问题,应首先阅读 WCF 故障排除快速入门 ,查看问题(和解决方案)是否在此处列出。

限制序列化过程的属性列在 数据的安全注意事项中。 限制与传输相关的资源消耗的属性列在 传输配额中。 作为 ServiceThrottle 类的成员,这些属性限制了应用层资源的消耗。

已选择上述值的默认值,以便在各种应用程序类型中启用基本应用程序功能,同时提供针对常见安全问题的基本保护。 但是,不同的应用程序设计可能会超出一个或多个控制器设置,不过可以通过其他手段保护应用程序的安全,并使应用程序按照设计的方式工作。 在这些情况下,您必须确定超出哪些节流值以及在哪个级别,并决定采取适当的措施来提高应用程序的处理能力。

通常,在编写应用程序并进行调试时,可以在配置文件中或以编程方式将ServiceDebugBehavior.IncludeExceptionDetailInFaults属性设置为true。 这指示 WCF 将服务异常堆栈跟踪返回到客户端应用程序进行查看。 此功能可报告大多数的应用程序级异常,旨在显示导致出现问题的相关配额设置。

某些异常会在运行时发生并超出了应用程序层的可见范围,不会通过此机制返回,System.ServiceModel.Dispatcher.IErrorHandler 针对这些异常的自定义实现可能无法处理。 如果位于Microsoft Visual Studio 等开发环境中,则大部分异常都会自动显示。 但是,开发环境设置(如 “仅我的代码 Visual Studio”)可以屏蔽一些异常。

无论开发环境的功能如何,都可以使用 WCF 跟踪和消息日志记录的功能来调试所有异常并优化应用程序的性能。 有关详细信息,请参阅 使用跟踪对应用程序进行故障排除

性能问题和 XmlSerializer

在运行时,使用XmlSerializer可序列化数据类型的服务和客户端应用程序会生成并编译这些数据类型的序列化代码,这可能导致启动性能缓慢。

注释

预生成的序列化代码只能在客户端应用程序中使用,而不能在服务中使用。

ServiceModel 元数据实用工具工具(Svcutil.exe)可以通过从应用程序的已编译程序集生成必要的序列化代码来提高这些应用程序的启动性能。 有关详细信息,请参阅 如何:使用 XmlSerializer 改进 WCF 客户端应用程序的启动时间

在 ASP.NET 下托管 WCF 服务时出现的性能问题

当 WCF 服务托管在 IIS 下并 ASP.NET 时,IIS 和 ASP.NET 的配置设置可能会影响 WCF 服务的吞吐量和内存占用。 有关 ASP.NET 性能的详细信息,请参阅 “提高 ASP.NET 性能”。 可能会产生意外后果的设置是 MinWorkerThreads,它是 ProcessModelSection 的一个属性。 如果应用程序具有固定或少量的客户端,则设置为 MinWorkerThreads 2 可能会在 CPU 使用率接近 100%的多处理器计算机上提供吞吐量提升。 这种性能的提高带来了成本:这也会导致内存使用量增加,这可以减少可伸缩性。

另请参阅