中间层客户端应用程序

本主题讨论特定于使用 Windows Communication Foundation (WCF) 的中间层客户端应用程序的各种问题。

提高中间层客户端应用程序的性能

与以前的通信技术(例如使用 ASP.NET 的 Web 服务)相比,由于 WCF 的功能集比较丰富,创建 WCF 客户端实例会更加复杂。 例如,打开 ChannelFactory<TChannel> 对象时,该对象会与服务建立一个安全会话,该过程将增加客户端实例的启动时间。 通常,这些额外的功能不会对客户端应用程序造成很大影响,这是因为 WCF 客户端在执行几次调用后将关闭。

然而,中间层客户端应用程序可以快速创建许多 WCF 客户端对象,因此,可以体验到初始化要求提高了。 调用服务时,有两种主要的方法可以提高中间层应用程序的性能:

  • 缓存 WCF 客户端对象,并尽可能在后续调用中重用它。

  • 创建一个 ChannelFactory<TChannel> 对象,然后使用该对象为每次调用创建新的 WCF 客户端通道对象。

使用这些方法时要考虑的问题包括:

  • 如果服务正在使用会话维护特定于客户端的状态,你则无法使用多客户端层请求重用中间层 WCF 客户端,因为服务的状态与中间层客户端的状态相关联。

  • 如果服务必须基于每个客户端执行身份验证,你则需要在中间层上为每个传入的请求创建新的客户端,而不是重用中间层 WCF 客户端(或 WCF 客户端通道对象),原因是在创建了 WCF 客户端(或 ChannelFactory<TChannel>)后将无法修改中间层的客户端凭据。

  • 由于通道及其创建的客户端是线程安全的,因此它们可能不支持同时向网络中写入多条消息。 如果要发送较大的消息,特别是消息流,则发送操作可能会阻塞,因为它要等待另一个发送操作完成。 这会导致两种问题:缺少并发性;当控制流返回到重用信道的服务(即,共享的客户端调用了一种服务,该服务的代码路径会导致对共享的客户端进行回调)时,存在死锁的可能性。 无论重用什么类型的 WCF 客户端,情况都是如此。

  • 无论您是否共享出错的通道,您都必须处理它。 然而,重用通道时,出错通道可以关闭多个挂起的请求或发送。

有关为多个请求重用客户端的最佳做法的演示示例,请参阅 ASP.NET 客户端中的数据绑定

此外,那些使用可用 XmlSerializer 进行序列化的数据类型的客户端会在运行时生成并编译这些数据类型的序列化代码,从而导致启动性能降低;但你可以提高这些客户端的启动性能。 通过从为应用程序编译的程序集生成必要的序列化代码,ServiceModel 元数据实用工具 (Svcutil.exe) 可提高这些应用程序的启动性能。 有关详细信息,请参阅如何:使用 XmlSerializer 改善 WCF 客户端应用程序的启动时间

请参阅