2013-12-04 2 views
2

У меня есть кусок кода, как это:Ускорить запрос SOAP в C#

foreach (var e in foobar) 
    { 
     var myObj = new MyObj(); 

     GenericResult res = soapClient.doSomething(e); 
     if(res.success == true){ 
      myObj.a = e.a; 
      myObj.b = e.b; 
     } 
    } 

Каждый SOAPRequest занимает около 500 миллисекунд, а иногда foobar это элементы так 1000+ я тратить много времени на ожидание ответ soapClient. Я пробовал использовать Parallel.ForEach, но он не работает, потому что поставщик SOAP принимает только сериализованные запросы. Поставщик предлагает использовать async звонки, такие как soapClient.doSomthingAsync Проблема заключается в том, что мне нечего делать, пока я не получил ответ soapClient.

Единственное решение, которое я имею в виду, использую Parallel.ForEach и lock в мыльном вызове

+2

Если вам нужно сделать 1000 запросов, вам нужно сделать 1000 запросов ... возможно, вы могли бы рассмотреть лучшую модель для API SOAP, которую вы вызываете, - это под вашим контролем? Можете ли вы сделать несколько экземпляров 'soapClient'? –

+0

@DanPuzey API не находится под моим контролем, и я не могу использовать больше экземпляров soapClient, потому что проверка множественного запроса зависит от учетной записи (я использую ключ API). Я использую Parallel For с блокировкой прямо сейчас, и это немного быстрее. Я думаю, что это лучшее решение :( – Federico

+0

Знаете ли вы, использует ли этот сервер HTTP 1.1? ..., который по умолчанию использует постоянные подключения. В противном случае, если это HTTP 1.0, вы можете потребовать, чтобы соединение было открыто (Keep-Alive), так что вам не нужно будет продолжать связывание TCP для каждого запроса. Вам нужно будет посмотреть трафик на проводе (с помощью WireShark/Fiddler) ... http: // stackoverflow.com/questions/4699013/does-webclient-use-keepalive ... Также, как вы создаете свой «прокси» (Добавить ссылку на службу или Добавить веб-ссылку?) ... это WCF? (возможно, вы нажимаете ограничения на дросселирование) –

ответ

0

Всего несколько вещей, которые вы можете попробовать.

  • Какой тип аутентификации применяется к вызову службы. Если служба и т. Д. Аутентифицируется против AD, вы должны убедиться, что только первый вызов аутентифицирован, а остальные вызовы просто контрейлерные. Аутентификация AD может занять значительное время (0,3 - 1,0 с)

  • Попробуйте установить Fiddler и использовать его как прокси-сервер WCF. Fiddler предоставит вам средства, чтобы разбить время, потраченное на различные части выполнения служебного вызова.

  • Вы пытались выполнить команду ping на сервере, на который вы нацелились, - приемлемы ли таймеры пинга ?.

  • Сколько времени тратится на первый вызов по сравнению со следующими вызовами. Первый вызов всегда будет занимать значительное количество времени, так как среда выполнения CLR должна генерировать нагрузку на лодку динамического XML-кода. Простое создание JIT-кода XmlSerializer является дорогостоящим, поскольку оно динамически генерирует код C#, удары компилятора CSC и загрузку сгенерированной DLL. Вы можете посмотреть на инструмент SGEN, что делает возможным генерировать XmlSerializer библиотек во время компиляции и вместо выполнения (обратите внимание, что это поможет только на первых таймингах исполнения)

Я не могу видеть сколько времени на самом деле тратится на стороне сервера, внутри выполнения doSomething(), поэтому трудно понять, сколько времени фактически тратится на сеть. Неисправное сетевое оборудование, кабели, коммутаторы, а также брандмауэры, таблицы маршрутизации, SLA и т. Д. Могут негативно повлиять на то, какую производительность вы можете извлечь из этого.

Причина, как уже упоминалось, наличие такого чатного интерфейса, как вы должны использовать, далеко не оптимальна, и владелец службы может столкнуться со всеми проблемами производительности на стороне сервера, если это их обычный способ разоблачения интерфейсов - но это еще одна история :)

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