Вызовы службы WCF всегда терпят неудачу через 30 секунд с (502) Bad Gateway - PullRequest
6 голосов
/ 04 мая 2010

У нас есть служба WCF (BasicHttpBinding), которая всегда завершится ошибкой через 30 секунд. Звонки до 30 секунд завершены без ошибок. Все, что длится более 30 секунд, завершится с ошибкой 502 Bad Gateway:

System.Net.WebException: удаленный сервер возвратил ошибку: (502) Bad Gateway.

Но все же вызов WCF продолжает выполняться в фоновом режиме (и в конечном итоге будет завершен). Мы подтвердили, что значение BasicHttpBinding - Binding - sendTimeout (в web.config) превышает 30 секунд (фактически установлено значение 5 минут). Мы подтвердили это как на клиенте, так и на сервере.

Вот полная трассировка стека:

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (502) Bad Gateway. ---> System.Net.WebException: The remote server returned an error: (502) Bad Gateway.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

Есть идеи, откуда исходит 30-секундный "тайм-аут" или почему возвращается ошибка 502 Bad Gateway?

РЕШЕНИЕ: Мы используем модуль маршрутизации запросов приложений IIS7, который имеет собственные настройки прокси. Настройки прокси имеют время ожидания по умолчанию 30 секунд. Увеличение этого значения до 600 секунд (10 минут) решило нашу проблему. Ошибка Bad Gateway не совсем корректна, но средство просмотра трассировки WCF (см. Ответ) помогло увидеть, что проблема была не в самой службе, а в проблеме между клиентом и службой wcf.

Ответы [ 3 ]

5 голосов
/ 04 мая 2010

Вы можете посмотреть попробуйте изменить другие значения конфигурации тайм-аута:

closeTimeout, openTimeout, recieveTimeout.

См. в этом сообщении MSDN для получения информации об элементах конфигурации, резюме ниже:

Клиентская сторона:

  • SendTimeout используется для инициализации OperationTimeout, который управляет всем взаимодействием при отправке сообщения (включая получение ответного сообщения в случае запроса-ответа). Этот тайм-аут также применяется при отправке ответных сообщений из метода CallbackContract.
  • OpenTimeout и CloseTimeout используются при открытии и закрытии каналов (когда не передается явное значение тайм-аута).

Сторона сервера:

  • Время ожидания отправки, открытия и закрытия такое же, как на клиенте (для обратных вызовов).
  • ReceiveTimeout используется уровнем ServiceFramework для инициализации тайм-аута простоя сеанса.

ДОБАВЛЕНО:

Единственное, что я могу предложить, - это использовать средство просмотра трассировок службы WCF, чтобы понять причину проблемы. См. SO Post , если вам нужны подробности о том, как его использовать.

1 голос
/ 07 сентября 2012

IIS -> Расширенные настройки -> Пределы подключения

Увеличьте это число (в секундах) до желаемого значения.

Надеюсь, это поможет любому гуглеру!

0 голосов
/ 06 октября 2011

Я сам сегодня столкнулся с этой проблемой. Загрузка файла в веб-службу WCF из приложения SL4 продолжала вызывать исключение ConnectionTimeout после 30 секунд.

Я обнаружил, что причиной проблемы является использование метода WebRequest.RegisterPrefix, рекомендованного Microsoft для преодоления обработки исключений Fault в Silverlight

bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

См. http://msdn.microsoft.com/en-us/library/ee844556(v=vs.95).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...