WCF客户端实例化和并发问题

时间:2011-02-25 22:02:07

标签: wcf concurrency client-side

希望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类应该Singleton一个serviceClient个实例,或者static类,并为每个调用创建一个新的serviceClient

我应该根据端点创建serviceClient(即数组或列表)(有10-100个端点)?

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

1 个答案:

答案 0 :(得分:0)

客户端没有限制,因为您拥有受控制的客户端代码,所以不需要限制,因此您可以控制执行的请求数。这就是服务的差异,在没有限制的情况下,无法控制在其他地方执行的服务请求数量(停止服务控制)。

因此,如果要控制在客户端上同时执行的请求数,则必须创建对象池 - 只有有限数量的MyWcfClient类可用,每个类将始终创建新的ServiceClient。请求将在队列中等待免费的MyWcfClient实例。

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

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

顺便说一下。还要检查asynchronous client calls以及如何correctly close服务客户端。