c# - 重用 WCF 服务客户端

标签 c# asp.net wcf

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

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

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

我能否将我的 ServiceClient 类设为全局或静态可用类,以便我的 ASP.NET 网页中的所有函数都可以使用相同的客户端。这似乎更有效率。这样做有什么问题吗?执行此操作时我应该考虑什么建议?

如果我向客户发出多个请求会怎样?大概它都是同步的,所以我调用 1 次还是 50 次应该无关紧要?

谢谢

最佳答案

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

当使用无 session HTTP 绑定(bind)(basicHttp、webHttp)时,您可以共享您的代理,甚至可以将其设为静态。每个调用都是单独处理的,服务上的异常不会使 channel 出错,而且它是透明的reuses opened HTTP persistent connections .但正因为如此,创建新的代理/ channel 应该不会有太大的开销。

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

关于c# - 重用 WCF 服务客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4645397/

相关文章:

C#对象比较和内存分配

c# - C# 中的 RegEx 无法正常工作

c# - 存储过程不接受整数参数

c# - C#中从OperationContext中读取JSON形式的请求内容

wcf - header 中的 WS-Addressing "To"元素

c# - 从 C++ 库方法返回的 "char*"获取 C# 字符串?

c# - 运算符(operator) ?。和扩展方法

c# - 在 WPF 中将自定义纸张尺寸打印到冲击式打印机

使用 OneLogin 和 DotNetOpenAuth 在 CrossDomain 上进行 ASP.Net 单点登录

c# - 是否有用于处理 Internet 上的大型数据集的设计模式?