HTTP 状态504

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

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

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

但我的问题是?如何更改 win32应用程序中的 App.config设置,以便有更多的时间处理其数据。我假设我需要这些变化,我的应用程序设置作为网络服务和 IIS 托管的 w 是扩展时间设置。

期待您的回复,并提前表示感谢。

202969 次浏览

CheckUpDown 有 对504错误的一个很好的解释:

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

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

这个问题完全是由于后端计算机(可能包括 Web 服务器)之间的 IP 通信速度较慢造成的。只有在承载 Web 服务器的站点上建立网络的人才能解决这个问题。

你不能。问题不在于你的应用没有耐心而且超时了; 问题在于中间代理没有耐心而且超时了。服务器在充当网关或代理时,没有从 URI 指定的上游服务器收到及时响应(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5)它很可能表明原始服务器有某种问题,所以它不能快速响应转发的请求。

可能的解决方案,没有一个能让你开心:

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

如果你使用的 ASP.Net 5(现在称为 ASP.Net Core v1)在你的 project.json“命令”部分确保你托管的每个站点的 Kestrel 代理监听端口不同,否则一个站点将工作,但另一个将返回一个504网关超时。

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

关于这个错误,我观察到的一点是,它只出现在来自服务器的第一个响应中,在 http 的情况下,该响应应该是握手响应。一旦一个即时响应从服务器发送到网关,如果在主响应花费时间后,它没有给出一个错误。这里的关键是服务器对请求的第一个响应应该是快速的。

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

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

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

我有另一个问题,给我一个504。虽然很遥远,但我会把它写在这里供谷歌人和子孙后代使用。

我有一个客户端调用另一个域(ActiveDirectory)中的 IIS 托管 Web 服务。客户端域和承载 Web 服务的域之间没有完全信任。 这两个域之间选择性信任的许多挑战之一是,在从一个域调用到另一个域时,Kerberos 无法工作。

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

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

在删除 spn 并允许调用回退到 NTLM 之后,它工作得很好。

正如我所说... ... 这不是你可能会遇到的事情,因为大多数组织不会冒险在两个域之间有这样的选择性信任... ... 但它给出了一个504,并导致我一些(更多)白发。