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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 01 августа 2012

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

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

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

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

исй:

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

0 голосов
/ 10 сентября 2011

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

0 голосов
/ 23 июня 2011

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

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

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

...