Очередь сервисных звонков - PullRequest
3 голосов
/ 26 марта 2012

Я внедряю приложение 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.

1 Ответ

3 голосов
/ 26 марта 2012

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

Значительные ограничения для служб Silverlight WCF будут

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

Эта статья CodeProject по Быстрый способ повысить производительность и масштабируемость клиентов ASP.NET, WCF и Desktop была полезна.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...