Привязка WCF к ASMX намного медленнее возвращает большие данные, чем стандартная веб-ссылка

Я привязываюсь к существующей веб-службе ASMX, используя ссылку на службу WCF. У меня есть метод, который возвращает объект DataSet, содержащий строку длиной 500 КБ.

Как стандартная веб-ссылка "старой школы", вызов этого метода занимает около 2-3 секунд. В качестве ссылки на службу WCF это занимает более 20 секунд. Сейчас это влияет на наши системы :(

Я пытался изменить привязки, чтобы максимизировать все maxReceivedMessageSize и maxBytesPerRead и т. д., но это не имело никакого значения.

Почему эталон WCF работает намного медленнее и что я могу сделать, чтобы это исправить?


person Duncan Watts    schedule 08.06.2011    source источник
comment
Каков размер передаваемого сообщения до и после? Первое, что нужно выяснить, связано ли это с пропускной способностью и накладными расходами на обработку (безопасность и т. д.). 500к не разумно.   -  person Marc Gravell    schedule 08.06.2011
comment
Пробовали ли вы просматривать трассировку WCF (для клиента) и журналы IIS (для сервера), чтобы увидеть, на что уходит время? Похоже, это на стороне клиента, но было бы неплохо сузить проблемную область.   -  person Josh Gallagher    schedule 22.06.2011
comment
Кроме того, наблюдается ли замедление при каждом вызове? Если вы позвоните в службу 10 раз подряд, будет ли она каждый раз одинаковой?   -  person John Saunders    schedule 05.09.2011


Ответы (3)


Казалось бы, здесь есть несколько проблем.

  1. Во-первых, службы WCF, сохраняющие состояние, если не настроено иное, должны активироваться при каждом новом подключении. Эта активация замедляется из-за SSL из-за дополнительных поездок туда и обратно для аутентификации. Как указано выше в одном из вопросов/предложений, попробуйте установить начальное соединение, а затем попытайтесь выполнить метод примерно 10 раз и измерьте время, необходимое для последующих вызовов, оно должно быть намного быстрее после первоначального вызова. На самом деле, согласно MS, WCF более эффективно обрабатывает вызовы, чем ASMX «старой школы», но все еще зависит от времени активации.

  2. Затем в WCF в фоновом режиме происходит какое-то сумасшедшее действие сериализации, и он плохо работает с объектом DataSet из-за безумного количества накладных расходов и метаданных, которые имеет объект DataSet. Если ДОЛЖЕН использоваться больший набор данных, вам следует изменить сериализацию потока на MTOM или Binary (но это работает только в том случае, если ваши клиенты также основаны на WCF/.NET). Другим вариантом было бы не использовать наборы данных, что, вероятно, является лучшим вариантом, когда речь идет о WCF. здесь — ссылка на интересную статью о скорости сериализации наборов данных.

Дополнительная статья о том, почему не следует использовать наборы данных.

ссылка:

http://msdn.microsoft.com/en-us/library/bb310550.aspx

http://blogs.microsoft.co.il/blogs/oshvartz/archive/2011/07/23/wcf-performance-using-datasets-part-2.aspx

http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx

person iMortalitySX    schedule 01.08.2012
comment
На самом деле работа всех, кто использует Stack Overflow, состоит в том, чтобы постоянно улучшать как вопросы, так и ответы. Спасибо за улучшение вашего ответа. - person John Saunders; 02.08.2012

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

Мой первый вопрос: почему вы изменили его на WCF? Была ли для этого определенная причина - я знаю, что это правильный путь, но есть ли конкретная причина, по которой это нужно было изменить сейчас? Были ли какие-либо изменения в интерфейсе, которые могли бы иметь широкий спектр последствий.

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

person Schroedingers Cat    schedule 23.06.2011
comment
Он не был изменен, он всегда был ссылкой wcf, веб-ссылка была добавлена ​​для проверки скорости, поскольку у нас есть другие приложения, которые загружают те же данные из той же веб-службы без каких-либо проблем со скоростью. Я хотел бы добавить, что этот веб-сервис работает за сертификатом ssl через https. - person Duncan Watts; 23.06.2011
comment
Хорошо, некоторые части интерфейса будут замедлять работу ( WCF и SSL ), но незначительно, если только вы не обрабатываете очень значительные объемы данных. Это указывало бы на изменение окружающей среды. Можете ли вы запустить тесты с использованием как новых, так и старых и новых методов и сравнить время. Тогда я бы предложил обеспечить одинаковый доступ к базе данных. Однозначного ответа нет, и не должно быть этой разницы, поэтому вам придется покопаться, чтобы определить, откуда возникла проблема. - person Schroedingers Cat; 27.06.2011

Какой тип привязки используется? Существуют привязки BasicHttpBinding и WSHttpBinding, а для имитации asmx рекомендуется использовать привязку BasicHttpBinding. В целом, WCF должен быть как минимум сопоставим с аналогом asmx. Если это не поможет, попробуйте изменить параметры параллелизма и режимы создания экземпляров для WCF.

person champloo    schedule 10.09.2011
comment
Он не может выполнить привязку к существующей службе asmx с помощью wsHttpBinding на клиенте. Очевидно, что он использует basicHttpBinding. - person Wiktor Zychla; 02.08.2012