2010-05-20 7 views
3

У меня есть клиент WCF (работает на Win7), указывающий на службу WebSphere.WCF клиент зависает от ответа

Все хорошо из тестового жгута (небольшое тестовое приспособление вне моего веб-приложения), но когда мои звонки в службу происходят из моего веб-проекта, один из вызовов (и только тот) крайне медленный, чтобы десериализовать (это занимает минуты VS секунд) и не только в первый раз.

я могу видеть из стельки, что ответ возвращается быстро, но затем клиент WCF висит на самом ответ на более чем за минуту до следующей строки кода попал отладчик, почти, если клиент имел проблема десериализации. Это происходит только в том случае, если в ответе у меня есть заданная строка pdf (операция генерирует pdf), base64 закодирован в chunked. Если, например, служба вызывает ошибку (таким образом, строка pdf отсутствует), тогда ответ десериализуется немедленно.

Опять же, если я отправляю тот же конверт через Soap-UI или извне веб-проекта, все хорошо.

Я нахожусь в убытке - что мне искать, и есть ли настройка конфигурации, которая могла бы сделать трюк?

Любая помощь оценена!

EDIT:

Я закодировал заглушки против того же контракта на обслуживание. Используя то же самое basicHttpBinding и вернув ту же самую строку pdf, регистрация задержек не зарегистрирована. Я думаю, что это исключает строку и привязку в качестве возможной причины. То, что осталось?

ответ

3

Изменение transferMode="Buffered" в transferMode="Streamed" на связывание сделал трюк!

Таким образом, полезная нагрузка, по-видимому, была разбита на мелкие биты размером с буфер.

Я думал, что то же самое можно было бы достичь, увеличив буферизацию (maxBufferSize="1000000"), но у меня было уже на месте, и это не помогло.

1

У меня был этот укус меня много раз. Проверьте свою конфигурацию клиента WCF, которую вы не пытаетесь использовать прокси-сервер Windows, этот шаг для проверки прокси-сервера (даже если он не настроен) будет много времени переваривать во время вашего соединения.

+0

ТНХ! как мне это сделать - есть ли какие-то конкретные настройки, которые мне нужно проверить? – JohnIdol

+0

useDefaultWebProxy = "false" не годится - все еще происходит - любое другое предложение? – JohnIdol

+0

Извините, когда я изменил свое значение с истинного на ложное, он избавился от моей скорости. –

0

Первые вещи, чтобы проверить:

  • ли конфиг же в веб-проекте и тестовый проект?
  • Когда вы тестируете из интерфейса SOAP, вы делаете это с того же сервера и в том же контексте безопасности, что и при запуске кода из веб-проекта. -Лучнется ли всплеск в памяти при возврате pdf?

Редактировать

Из ваших замечаний 1 мин ожидания, кажется, что он ждет тайм-аут. Вы также упоминаете транзакции.

Мне интересно, если проблема в другом месте. Вызов службы WCF идет в порядке, но вызов внутри транзакции, и в транзакции нет (или нет) транзакции (я угадываю здесь), тогда транзакция/код будет висеть в течение 1 минуты, пока она ждет таймаута.

Edit 2

Следующая вещи, чтобы проверить:

  • Есть ли разница в коде теста и в веб-проекте, о том, как в настоящее время называется услуга.
  • Есть ли differnce в рамочном варианте, например, это один 3,0, а другой 3,5
+0

thx - привязка + конечная точка - то же самое, и ссылка на службу также точно такая же. Я делаю все тесты с одной машины в том же контексте. Единственное различие нас в том, что это происходит только в веб-проекте. Не проверял память - попробует это и ищет шипы. – JohnIdol

+0

Интересно, что, хотя я вижу, что ответ сразу возвращается с помощью скрипача, трассировка WCF регистрирует пару запроса/ответа после завершения десериализации - через 1 минуту (и показывает, что транзакция заняла более 1 минуты) – JohnIdol

+0

Извините за путаницу - таких сделок нет. По транзакции я имел в виду пару запроса/ответа. На данный момент я думаю, что проблема заключается в том, что строка pdf кодируется base64. – JohnIdol

1

Если кончики других пользователей не поможет, вы можете Enable WCF Tracing и открыть его в Service Trace Viewer , Информация подробно описана, но она позволила мне решить ряд проблем, связанных с проблемой идентичности в прошлом.

Дополнительную информацию о трассировке WCF можно найти on MSDN.

+0

Я подключился, но не смог обнаружить ничего странного. Было бы легче, если бы я понял, что искать. – JohnIdol

+0

Если файл журнала достаточно мал, попробуйте добавить его в свой тестовый вопрос. Если нет, вы можете отправить его мне по адресу [email protected] (с моим фактическим именем, очевидно), и я посмотрю. –

0

Может ли клиентская сторона попытаться проанализировать, какой тип контента поступает со стороны сервера? Попробуйте указать тип mime ответа службы явно на стороне сервера, например. Response.ContentType = "application/pdf" EDIT: На стороне клиента я подразумеваю любой возможный медиатор, например, брандмауэр или пакет безопасности.

+0

thx, но «зависание» происходит до того, как он даже не дойдет до этого (кстати, тип контента уже указан как u предлагаю) – JohnIdol

1

Две вещи вы можете попробовать:

  1. Настройка параметров readerQoutas для клиента. См. http://msdn.microsoft.com/en-us/library/ms731325.aspx

  2. Отключить «только мой код» в вариантах отладки. Инструменты -> Параметры -> Отладка -> Общие "Включить только мой код (только управляемый)" и посмотреть, можно ли перехватывать межсетевые исключения WCF.

// huusom

+0

уже пытался поймать все исключения и не повезло - также попытался максимизировать всех читателей квот и не повезло! :( – JohnIdol

+0

это становится все веселее :) Возможно ли, что мы увидим конфигурацию для клиента и спецификации сервиса? – Huusom

+0

нашел проблему! см. мой собственный ответ - мне нравится, что вы отвечаете хотя, так что +1 – JohnIdol

1

У меня была такая же проблема ... Проблема WCF, IMO, заключается в десериализации строки base64, возвращаемой службой, в сторону клиента byte [].

Проще всего решить эту проблему, если вы не можете изменить свою конфигурацию обслуживания (например: use transferMode = «Потоковая передача») - это адаптировать вашу клиентскую сторону DataContract/ServiceContract. Замените тип «byte []» на «string» в Response DataContract.

Следующая просто декодировать возвращаемая строка себя с куском кода, такого как:

байт [] файла = Convert.FromBase64String (pdfBase64String);

Чтобы загрузить PDF-файл 70 КБ, он использовал требуемый ~ 6 секунд. С предложенным изменением здесь выше, теперь требуется < 1 сек.

V.

PS .: Что касается режима передачи, я пытаюсь изменить только на стороне клиента (transferMode = «StreamedResponse»), но без улучшения ...

+0

интересный, thx - я решил, установив transferMode = «Потоковый» на клиенте, так как это единственное, что я имел доступ к – JohnIdol

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