我们有一个WCF服务(BasicHttpBinding),它将在30秒后始终失败。 30秒以内的调用完成,没有错误。超过30秒的任何操作都会失败,并显示502 Bad Gateway异常:
但是WCF调用仍在后台运行(并将最终完成)。我们已经确认,BasicHttpBinding-绑定(bind)-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分钟)可以解决我们的问题。错误的网关错误不是完全正确的,但是WCF Trace Viewer(请参阅答案)帮助我们发现问题不是服务本身,而是客户端和wcf服务之间的问题。
最佳答案
您可能需要尝试修改其他超时配置值:
closeTimeout,openTimeout,receveTimeout。
有关配置项的信息,请参见this MSDN post,摘要如下:
添加:
我可以建议的唯一另一件事是使用WCF服务跟踪查看器来探究问题根源。如果您需要有关如何使用它的详细信息,请参见此SO Post。