当我的win32(c#)应用程序调用Web服务时,我收到以下错误。
The request failed with HTTP status 504: Gateway timeout server response timeout.
我理解'我认为'这是因为上游请求没有得到及时的响应。
但我的问题是这个?如何更改win32应用程序中的 app.config 设置,以便有更多时间处理其数据。我假设我要求在我的应用程序设置上进行这些更改,因为web服务和托管ws的IIS设置的时间较长。
期待回复,并提前感谢你。
斯科特
答案 0 :(得分:49)
你做不到。问题不在于您的应用程序不耐烦并且超时;问题是中间代理不耐烦并超时。 “服务器在充当网关或代理时,没有收到来自URI指定的上游服务器的及时响应。” (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5)它很可能表明原始服务器存在某种问题,因此它无法快速响应转发的请求。
可能的解决方案,其中任何一个都不会让你开心:
答案 1 :(得分:22)
CheckUpDown有a nice explanation of the 504 error:
服务器(不一定是Web服务器)充当网关或代理,以满足客户端(例如您的Web浏览器或我们的CheckUpDown机器人)访问请求的URL的请求。此服务器未从其访问的上游服务器收到及时响应以处理您的HTTP请求。
这通常意味着上游服务器已关闭(对网关/代理没有响应),而不是上游服务器和网关/代理不同意交换数据的协议。
此问题完全是由于后端计算机(可能包括Web服务器)之间的IP通信速度慢。只有在托管Web服务器的站点上设置网络的人才能解决此问题。
答案 2 :(得分:3)
假设访问代理服务器A(例如,nginx),并且服务器A将请求转发到另一服务器B(例如,tomcat)。
如果此过程持续很长时间(超过代理服务器读取超时设置),A仍然没有得到B的完整响应。 它发生了。
对于nginx,你可以配置proxy_read_timeout(在位置)属性来解决他的问题。但是如果你设置的值太高,这通常不是一个好主意。这可能会隐藏真正的错误。您最好改进设计以真正解决这个问题。
答案 3 :(得分:1)
如果你使用ASP.Net 5(现在称为ASP.Net Core v1)确保你的project.json"命令"您托管的每个站点的部分,Kestrel代理侦听端口在站点之间不同,否则一个站点将工作,但另一个站点将返回504网关超时。
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5090"
},
答案 4 :(得分:1)
我观察到的有关此错误的一件事是仅出现来自服务器的第一个响应,如果http应该是握手响应。一旦立即响应从服务器发送到网关,如果在主响应花费时间之后它不会给出错误。这里的关键是服务器请求的第一个响应应该很快。
答案 5 :(得分:0)
我还有另外一个问题给了我一个504.这是相当远的但我会在这里为googlers和后代写下来...
我有一个客户端调用另一个域(Active Directory)中托管的IIS托管Web服务。客户端域与托管Web服务的域之间没有完全信任。 这两个域之间选择性信任的众多挑战之一是Kerberos在从一个域调用到另一个域时不起作用。
在我的情况下,我试图在另一个域中调用服务,在那里我发现SPN已注册。像这样:http / myurl.test.local(只是一个例子)
这会强制调用使用Kerberos而不是让它回退到NTLM,这让我从调用服务器返回405。
删除spn并允许调用回退到NTLM后,它可以正常工作。
正如我所说的......这不是你可能遇到的事情,因为大多数组织都没有冒险在两个域之间拥有这样的选择性信任...但是它给了504并且引起了我一些(更多) )白发。