重用WCF服务客户端

时间:2011-01-10 09:43:36

标签: c# asp.net wcf

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

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

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

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

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

由于

2 个答案:

答案 0 :(得分:8)

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

当使用无会话HTTP绑定(basicHttp,webHttp)时,您可以共享代理甚至使其成为静态代理。每个调用都是单独处理的,服务上的异常不会对通道造成错误,而且透明reuses opened HTTP persistent connections。但正因为如此,创建新的代理/渠道应该没有大的开销。

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

答案 1 :(得分:1)

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

在此处阅读更多内容:ChannelFactory

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