2008-11-04 145 views
59

当我的win32(c#)应用程序调用Web服务时,出现以下错误。HTTP状态504

The request failed with HTTP status 504: Gateway timeout server response timeout. 

我明白'我认为'这是因为上游请求没有及时得到响应。

但我的问题是这样吗?如何更改我的win32应用程序中的app.config设置以允许更多时间处理其数据。我假设我需要在我的应用程序设置上进行这些更改,因为web服务和托管ws的IIS设置的时间较长。

期待回复,并提前致谢。

斯科特

回答

18

的CheckUpDown有a nice explanation of the 504 error

服务器(不一定是Web服务器)充当网关或代理,以满足客户端的请求(例如Web浏览器或我们的CheckUpDown机器人)访问请求的URL。该服务器没有收到来自它所访问的上游服务器的处理HTTP请求的及时响应。

这通常意味着上游服务器关闭(对网关/代理没有响应),而不是上游服务器和网关/代理不同意交换数据的协议。

此问题完全是由于后端计算机(可能包括Web服务器)之间的IP通信速度较慢。只有在托管Web服务器的站点上安装网络的人才能解决此问题。

41

你不行。问题不在于你的应用程序不耐烦并且超时;问题是中间代理不耐烦并超时。 “作为网关或代理的服务器没有收到URI指定的上游服务器的及时响应。” (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5)这很可能表明源服务器存在某种问题,所以它不会对转发的请求做出快速响应。

可能的解决方案,其中没有一个是可能使你快乐:代理的

  • 增加超时值(如果这是你的控制之下)
  • 提出请求到不同的服务器(如果有另一使用相同的数据服务器)
  • 不同让你的要求(如果可能的话),使得你在每次请求的数据较少
  • 再试一次服务器是不是有问题
+0

我遇到了同样的问题,但重新启动```Apache`和`Tomcat`解决了这个问题。这是否意味着我假设的原始服务器是我的Web服务器,处理HTTP请求的速度太慢? – 2013-04-17 12:36:46

1

如果您使用ASP.Net 5(现在称为ASP.Net Core v1)确保在您的project.json中的“命令”部分为您托管的Kestrel代理侦听端口在站点之间有所不同,否则一个站点将工作,但另一个将返回504网关超时。我观察到关于此错误

"commands": { 
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5090" 
    }, 
1

一件事是仅出现在从服务器,这在HTTP的情况下应该是握手响应的第一反应。一旦从服务器向网关发送立即响应,如果在主响应需要时间之后它不会给出错误。这里的关键是服务器对请求的第一个响应应该是快速的。

2

假设访问代理服务器A(例如nginx),并且服务器A将请求转发给另一个服务器B(例如tomcat)。

如果这个过程持续很长时间(超过代理服务器读取超时设置),A仍然没有得到完整的响应B. 它发生了。

对于nginx,你可以配置proxy_read_timeout(in location)属性来解决他的问题。但是这通常不是一个好主意,如果你设置的值太高。这可能会隐藏真正的错误。你最好改进设计来真正解决这个问题。