WCF客户端实例和并发问题

WCF客户端实例和并发问题,wcf,concurrency,client-side,Wcf,Concurrency,Client Side,希望WCF通过Throttling在服务端实现实例和并发管理 我的服务客户端是一个ASP.NET应用程序。它使用多个WCF服务,因此我在运行时创建并参数化WCF客户端(不使用配置文件) 只有端点地址是动态的,所有服务(客户端使用)都具有相同的方法签名(相同的契约) 因此,我通过Visual Studio引用了该服务,它创建了我的服务代理,因此我只需在运行时处理端点地址: class MyWcfClient { void DoSomething(string endpintAddress,

希望
WCF
通过
Throttling
在服务端实现实例和并发管理

我的服务客户端是一个
ASP.NET
应用程序。它使用多个
WCF
服务,因此我在运行时创建并参数化
WCF
客户端(不使用配置文件)

只有端点地址是动态的,所有服务(客户端使用)都具有相同的方法签名(相同的契约)

因此,我通过
Visual Studio
引用了该服务,它创建了我的服务代理,因此我只需在运行时处理端点地址:

class MyWcfClient
{
   void DoSomething(string endpintAddress, int data)
   {
      // Create 'binding' and 'endpoint' ('endpoint' address is dynamic)
      ServiceReference.ServiceClient serviceClient = new ServiceReference.ServiceClient(binding, endpoint);
      // Parametrize 'serviceClient'
      // Call WCF method (send 'data' to appropriate endpoint)
      serviceClient.CLose();
   }
}
由于客户端是asp.net应用程序,每个请求都在其自己的工作线程上运行(WCF方法调用非常轻快,因此线程不会长时间阻塞)

我的问题是关于客户端的实例化和并发性

MyWcfClient
类应该是带有一个
serviceClient
实例的
Singleton
,还是应该是
static
类,并为每个调用创建一个新的
serviceClient

我是否应该基于端点(有10-100个端点)创建
serviceClient
(即数组或列表)


请注意,我的asp.net线程不应被长时间阻止(即在队列中等待通过
WCF
发送相关的
数据)。

客户端没有限制,也不需要限制,因为您可以控制客户端代码,所以您可以控制执行的请求数。这就是服务的不同之处,在没有节流的情况下,无法控制在其他地方执行的输入请求的数量(不受服务控制)

所以,如果您想控制在客户端上并发执行的请求数量,您必须创建对象池——可用的MyWcfClient类的数量有限,并且每个类将始终创建新的ServiceClient。请求将在队列中等待空闲的MyWcfClient实例

若您唯一的问题是如何创建ServiceClient实例,那个么答案取决于绑定的类型

  • 具有可靠会话或安全上下文的Net.Tcp、Net.Pipe或WsHttp等会话绑定:为每个通信关系创建新实例。如果您的关系只是一次通话,请为每次通话创建新的指示。所以您可以将静态类与静态方法一起使用,并在该方法中创建新实例
  • 无会话绑定,如BasicHttp或WebHttp:您可以对多个调用重用客户端,但不能在后续调用之间关闭客户端。您可以使用准备好的客户端实例数组。您仍然需要在此处处理一些错误

顺便问一下,还检查服务客户端的方式。

WCF
支持在提出此问题时我不知道的某种缓存(
MRU
caching)。不过,我不知道如何在我的场景中使用它,因为有几篇文章是关于它的。@Xaqron:如果在代码中提供绑定,就不能使用MRU缓存。只有在提供端点配置的名称时,MRU缓存才会工作。MRU依赖于端点配置、远程地址(您可以将另一个地址传递给代理构造函数)和回调接口(仅适用于双工服务)。您是对的,在阅读了一些文章后,我决定将绑定移动到配置文件并使用MRU缓存。我不需要会话,但第二个链接仍然需要
Message
security.404