2012-03-26 2 views
3

Я внедряю приложение Silverlight, которое сильно использует службы WCF, теперь я имею в виду, что иногда есть несколько длинных вызовов служб, которые блокируют выполнение других вызовов службы.Очередь вызова службы

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

Я использую службы агентов обернуть службы вызовов

public interface IExampleServiceAgent 
{ 
    void ProcessData(int a, string b, EventHandler<ProcessDataCompletedEventArgs> callback); 
} 


Public ExampleServiceAgent1 : IExampleServiceAgent 
{ 
    ExampleClient _Client = new ExampleClient(); 

    public void ProcessData(int anInt, string aString, EventHandler<ProcessDataCompletedEventArgs> callback) 
    { 
      EventHandler<ProcessDataCompletedEventArgs> wrapper = null; 
      wrapper = (a,b) => 
      { 
       callback(a,b); 
       _Client.ProcessDataCompleted -= wrapper; 
      } 
      _Client.ProcessDataCompleted += wrapper; 
      _Client.ProcessDataAsync(anInt,aString); 
    } 
} 

приведенный выше агент службы затем будет вызываться из кода следующим образом:

ServiceAgent.ProcessData(1,"STRING", (a,b) => 
{ 
    if (b.Error != null) 
    { 
     //Handle Error 
    } 
    else 
    { 
     //DO something with the data 
    } 
} 

Есть ли способ, которым я мог бы поставить эти вызовы службы в очередь и выполнять их один за другим?

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

+0

** Вместо **, я бы сосредоточиться на том, почему эти призывы так долго и, наконец, тайм-аут. А также почему они вызывают ** другие вызовы ** для тайм-аута. Это не естественно. – Aliostad

+0

Помимо добавления уровня очереди на клиента, вы рассмотрели возможность отключения некоторых ограничений по умолчанию для служб WCF на стороне сервера? Блокировка происходит только тогда, когда ограничение на соединение 2 на один IP-адрес или предел MaxConcurrentConnections равны по умолчанию. Предел IP-адреса является вашей первой проблемой, если вы нажимаете на WCF с несколькими асинхронными вызовами. –

+0

Причина, по которой некоторые звонки занимают много времени, - это большие объемы данных, с которыми им приходится иметь дело. если я получаю 2 медленных вызова одновременно, тогда есть высокая вероятность того, что все остальные вызовы будут таймаутом до завершения медленных вызовов. @HiTechMagic есть ли встроенная очередь в WCF для предотвращения блокировки? – Midimatt

ответ

3

Услуги WCF могут справиться с огромным количеством вызовов, но во избежание атак типа «отказ в обслуживании» количество запросов, которые могут быть обработаны, по умолчанию ограничено.

Существенные ограничения на услуги Silverlight WCF будет

  • предел по умолчанию 2 одновременных вызовов с одного IP-адреса.
  • Предел приблизительно 10-16 одновременных соединений (документация зависит от этого).

Данная статья CodeProject на Quick Ways to Boost Performance and Scalability of ASP.NET, WCF and Desktop Clients была полезна.

Я предполагаю, что вы сразу же попадаете в первую проблему. В вашем WCF конфигурации необходимо добавить следующее увеличить отдельные соединения IP:

<system.net> 
    <connectionManagement> 
    <add address="*" maxconnection="100" /> 
    </connectionManagement> 
</system.net> 

Вы можете затем ударил второй предел, для которого решение является подправить поведение службы в веб/App.config файлов.

Вот несколько ссылок, которые я нашел в то время как перебирая эти вопросы себе:

+0

Увеличение максимальных соединений остановило таймауты, которые здорово, я должен буду прочитать эти статьи и посмотреть, есть ли другие трюки, которые я могу использовать. благодаря – Midimatt

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