2014-11-07 2 views
0

Я работаю с WSDL API, который имеет ограничение в 100 сеансов в любое время. Я использую C#, поэтому это означает, что в моем приложении у меня может быть только 100 экземпляров класса WSSession, иначе API отклонит вызовы.Управление и ограничение количества сеансов API

Каков наилучший способ, которым я мог бы приблизиться к этому? Я работаю в большом приложении, которое может легко поразить ограничение на 100 сеансов. Я не хочу бросать ошибку, когда предел сессии поражен, вместо этого я предпочел бы блокировать до тех пор, пока сессия не будет доступна.

+0

Какая структура веб-сервиса вы используете? WCF? – user1431072

+0

Извинения, я имел в виду WSDL –

ответ

2

Вы можете перенаправить все свои удаленные вызовы через единую службу, в которой хранится счетчик количества операций, выполняемых в момент вызова.

Вы можете использовать Semaphore для управления параллелизмом на заданном блоке.

Предполагая, что у вас есть служба прокси, созданная для внешнего веб-сервиса, вы можете создать такую ​​услугу, чтобы обрабатывать все вызовы. Я также предполагаю, что вы используете инверсию управления, поэтому вы должны быть уверены, что - это всего лишь один экземпляр этой службы обработки все звонки.

Существуют альтернативы этому;

  • переместив семафор, и делая, что синглтон
  • или давая семафорное имя.

Услуги:

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(...)); 
+0

, как насчет того, чтобы сменить его на одиночный? – dotctor

+0

Я предполагаю, что он использует какой-то IoC, который, вероятно, является диким угаданием –

Смежные вопросы