HTTP状态504


72

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

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

我理解“我认为”,这是因为上游请求未及时得到响应。

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

期待您的回复,并先谢谢您。

史考特

Answers:


52

你不能 问题不在于您的应用程序不耐烦且超时。问题是中间代理人不耐烦并且超时。“服务器虽然充当网关或代理,但没有收到URI指定的上游服务器的及时响应。” (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5)最有可能表明原始服务器存在某种问题,因此它无法快速响应转发的请求。

可能的解决方案,没有一个能让您满意的:

  • 增加代理的超时值(如果在您的控制之下)
  • 向另一台服务器发出请求(如果另一台服务器具有相同的数据)
  • 提出不同的请求(如果可能),以便一次请求更少的数据
  • 服务器没有问题后再试一次

我遇到了相同的问题,但是重新启动ApacheTomcat解决了此问题。这是否意味着origin server我假设是我的Web服务器,处理HTTP请求太慢?
凯文·梅雷迪斯

5
这意味着原始服务器(带有数据的Web服务器)对于代理(试图代表您访问原始服务器的中间服务器)太慢。
james.garriss 2013年

22

CheckUpDown很好地解释了504错误

服务器(不一定是Web服务器)充当网关或代理,以履行客户端(例如,Web浏览器或我们的CheckUpDown机械手)访问请求的URL的请求。该服务器未收到其用来处理HTTP请求的上游服务器的及时响应。

这通常意味着上游服务器已关闭(对网关/代理无响应),而不是上游服务器和网关/代理未就交换数据的协议达成共识。

此问题完全是由于后端计算机(可能包括Web服务器)之间的IP通信缓慢所致。只有在承载Web服务器的站点上设置网络的人员才能解决此问题。


3

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

如果此过程持续了很长时间(超过了代理服务器读取超时设置),则A仍未获得B的完整响应。

对于Nginx,您可以配置proxy_read_timeout(in location)属性来解决他的问题。这可能会隐藏真正的错误。您最好改进设计以真正解决此问题。


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的情况下,它应该是握手响应。一旦将立即响应从服务器发送到网关,则在主响应花费时间之后,它不会发出错误。这里的关键是服务器对请求的第一个响应应该很快。


0

我遇到了另一个问题,给我504。这很遥远,但是我会在这里写给Google员工和后代...

我有一个客户端调用另一个域(Active Directory)中托管的IIS托管的Web服务。客户端域和托管Web服务的域之间没有完全信任。这两个域之间的选择性信任所带来的众多挑战之一是,当从一个域到另一个域进行调用时,Kerberos无法正常工作。

以我为例,我试图在另一个域中调用服务,发现该域已注册了SPN。像这样:http / myurl.test.local(只是一个例子)

这将强制调用使用Kerberos,而不是让它回落到NTLM,这使我从调用服务器返回了405。

删除spn并允许调用回退到NTLM之后,它可以正常工作。

就像我说的那样...您可能不会遇到这种情况,因为大多数组织都不敢冒险在两个域之间建立这样的选择性信任...但是它给出了504并导致了我(更多)白发。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.