重用WCF服务客户端

我有一个WCF Web服务,充当我的ASP.NET网页的数据提供者。

在整个网页中,通过自动生成的ServiceClient对Web服务进行了多次调用。

目前,我创建了一个新的ServiceClient并为每个请求打开它,即获取用户,获取角色,获取客户列表等….其中每个都将创建一个新的ServiceClient并打开一个新连接。

我可以使我的ServiceClient类成为全局或静态可用的类,以便我的ASP.NET网页中的所有函数都可以使用同一个客户端。 这似乎更有效率。 这样做有什么问题吗? 这样做时我应该考虑哪些建议?

如果我向客户提出多个请求会怎样? 据推测,这一切都是同步的,所以如果我拨打1或50个电话应该无关紧要?

谢谢

当使用会话(带安全上下文或可靠会话的wsHttp)或连接(net.tcp,net.pipe)定向绑定时,您必须以您希望处理会话的方式处理代理。 因此,如果您共享代理,则所有调用都将在单个WCF会话中处理(默认情况下由单个服务实例处理)。 但是您必须处理额外的复杂性,例如:未处理的服务exception将终止您的频道,并且来自客户端的调用将导致exception。

使用无会话HTTP绑定(basicHttp,webHttp)时,您可以共享代理甚至使其成为静态代理。 每个调用都是单独处理的,服务exception不会使通道出错 ,它会透明地重用打开的HTTP持久连接 。 但正因为如此,创建新的代理/渠道应该没有大的开销。

所以我的建议是:当您在ASP.NET应用程序中的单个请求处理中需要多次调用服务时,请使用相同的代理/通道。 但是不要在不同的请求之间共享代理/通道。

我认为使用ChannelFactory可以解决您的问题。 如果我是对的, ChannelFactory有一个连接池并重新使用这些通道。 这样做的好处是通道不会每次都被设置,而只是第一次。

在这里阅读更多: ChannelFactory

要处理通道的处理,您需要一些特殊的处理,因为通道可以在处理中抛出exception 。 我写了一个mapper来处理这个问题,你可以在这里阅读: http : //blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/