У нас есть служба 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.