Необъяснимое время ожидания службы WCF - PullRequest
2 голосов
/ 12 января 2012

Запуск веб-сайта MVC, который вызывает службу WCF.
Сайт и сервис на 2 разных машинах.
.NET Framework 4; IIS 7.

Производственный сайт испытывает тайм-аут, когда не должен. Я создал самые простые образцы, которые я мог (простой веб-сайт, который вызывает метод службы, который возвращает «привет, мама» после задержки), и смог воспроизвести проблему. Вот как это происходит:

  • Клиентское веб-приложение имеет привязку SendTimeout, установленную на 6 минут.
  • Служба сервера ничего не делает, только записывает сообщение в файл, спит 5 минут, пишет другое сообщение.
  • Сообщения, записанные в файл на сервере, являются правильными; трассировка сервера не показывает проблем.
  • Клиент никогда не получает возвращаемое значение от метода обслуживания сервера. Как будто он просто теряет соединение с сервером.
  • Клиент генерирует TimeoutException через 6 минут (любое превышение тайм-аута только задерживает исключение). Если я изменю время ожидания потока на сервере на 4 минуты, все работает нормально. Это повторяется, и никто не возится с этим тестовым сценарием.

Итак, вот соответствующий раздел конфигурации клиента:

    <binding name="BasicHttpBinding_IService1"
             closeTimeout="00:6:00"
             openTimeout="00:6:00"
             receiveTimeout="00:6:00"
             sendTimeout="00:6:00"
             allowCookies="false"
             bypassProxyOnLocal="false"
             hostNameComparisonMode="StrongWildcard"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647"
             messageEncoding="Text"
             textEncoding="utf-8"
             transferMode="Buffered"
             useDefaultWebProxy="true">

<httpRuntime executionTimeout="1200"
             maxRequestLength="10240" />

  <serviceBehaviors>
    <behavior>
      <serviceTimeouts transactionTimeout="00:6:00" />
    </behavior>
  </serviceBehaviors>

На сервере присутствуют одинаковые значения. Ниже приведены вещи, которые я пробовал:

  • Добавлен элемент serviceTimeouts выше.
  • Гарантировано, что для закрытия прокси-класса клиента будет выполнен вызов (хотя в моем случае это не будет проблемой, поскольку ошибка возникает каждый раз).
  • Явно создан канал, приведен как IContextChannel и установлен OperationTimeout (как указано здесь ).
  • Увеличено свойство FailureInterval пула приложений сервера в IIS.
  • Гарантировал, что все значения времени ожидания элемента привязки в конфигах были установлены на значение, превышающее время, затрачиваемое методом service.
  • Создание ChannelFactory и установка его значения Endpoint.Binding.SendTimeout.
  • Убедитесь, что Compilation debug = "false" было установлено на клиенте и сервере (прочитайте, что таймауты [не уверены, какие тайм-ауты] не соблюдаются правильно, если это не установлено).
  • Увеличены maxBufferSize, maxBufferPoolSize и maxReceivedMessageSize, даже если это не должно иметь никакого отношения к проблеме (сервер просто возвращает «привет, мама»).
  • Установите SendTimeout явным образом в коде на клиентском прокси (поскольку это должно быть соответствующее время ожидания).
  • Вызывается служба из консольного приложения (тот же результат).

Что еще можно попробовать?

[Изменить] Служба перенесена на тот же компьютер, что и веб-приложение, и проблема исчезла.

1 Ответ

1 голос
/ 20 января 2012

Это была политика HTTP на брандмауэре в рабочей среде: максимальное время запроса 5 минут.

...