Запуск веб-сайта 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 явным образом в коде на клиентском прокси (поскольку это должно быть соответствующее время ожидания).
- Вызывается служба из консольного приложения (тот же результат).
Что еще можно попробовать?
[Изменить]
Служба перенесена на тот же компьютер, что и веб-приложение, и проблема исчезла.