管理和限制API会话的数量

时间:2014-11-07 18:53:38

标签: c# session design-patterns

我正在使用任何时候都有100个会话限制的WSDL API。我使用C#,所以这意味着在我的应用程序中我只能存在100个WSSession类实例,否则API会拒绝调用。

我能接近这个的最佳方式是什么?我在一个很容易达到100个会话限制的大型应用程序中工作。我不想在达到会话限制时抛出错误,而是在会话可用之前阻止我。

1 个答案:

答案 0 :(得分:2)

您可以通过单个服务路由所有远程呼叫,在此服务中,您可以计算呼叫发生时正在进行的操作数量。

您可以使用Semaphore来控制给定块的并发性。

假设您为外部Web服务创建了代理服务,您可以创建这样的服务来处理所有调用。 我还假设您正在使用控制反转,因此您需要确保只是此服务的单个实例处理所有调用。

还有其他选择;

  • 将信号量移出并使其成为单身人士
  • 或给信号量命名。

服务:

 public class PooledService 
 {
     private readonly Semaphore _semaphore;   
     private readonly WebService _service;

     public PooledService(WebService service, int max) 
     {
         _semaphore = new Semaphore(max, max);
         _service = service;
     }   

     public R Execute<R>(Func<WebService, R> expression) 
     {  
        //will block if concurrency is at maximum, waiting up to 5 seconds 
        //if you want to wait forever, then just call _semaphore.WaitOne();
        if (!_semaphore.WaitOne(5000)) 
            throw new Exception("Timed Out"); 

        try 
        {
            return expression(_service);
        } 
        finally 
        {
           _semaphore.Release();
        }
    }

     public void Execute(Action<WebService> expression) 
     {  
        //will block if concurrency is at maximum, waiting up to 5 seconds 
        //if you want to wait forever, then just call _semaphore.WaitOne();
        if (!_semaphore.WaitOne(5000)) 
            throw new Exception("Timed Out"); 

        try 
        {
            expression(_service);
        } 
        finally 
        {
           _semaphore.Release();
        }
    }
}

你可以这样使用它;

var service = new PooledService(new WebService(), 100); //maximum of 100 concurrent calls
var response = service.Execute(s => s.SomeRemoteCall(...));