中间层客户端应用程序

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

提高 Middle-Tier 客户端性能

与以前的通信技术(如使用 ASP.NET 的 Web 服务)相比,由于 WCF 功能集丰富,WCF 客户端实例的创建可能更为复杂。 例如,当对象打开时 ChannelFactory<TChannel> ,它可以与服务建立安全会话,这会增加客户端实例的启动时间。 通常,这些附加功能功能不会影响客户端应用程序,因为 WCF 客户端会多次调用,然后关闭。

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

  • 缓存 WCF 客户端对象,并在可能的情况下重复使用它进行后续调用。

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

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

  • 如果服务使用会话维护客户端特定的状态,则不能使用具有多客户端层请求的中间层 WCF 客户端,因为该服务的状态与中间层客户端的状态相关联。

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

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

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

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

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

另请参阅