【问题标题】:HTTP Status 504HTTP 状态 504
【发布时间】:2008-11-04 11:05:48
【问题描述】:

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

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

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

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

期待回复,提前感谢您。

【问题讨论】:

    标签: http


    【解决方案1】:

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

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

    • 增加代理的超时值(如果它在您的控制之下)
    • 向其他服务器发出请求(如果有其他服务器具有相同的数据)
    • 以不同的方式提出您的请求(如果可能),这样您一次请求的数据就会更少
    • 在服务器没有问题后重试

    【讨论】:

    • 我遇到了同样的问题,但重新启动 ApacheTomcat 解决了这个问题。这是否意味着origin server(我假设是我的 Web 服务器)处理 HTTP 请求的速度太慢了?
    • 这意味着源服务器(带有数据的网络服务器)对于代理(试图代表您访问源服务器的中间服务器)来说太慢了。
    【解决方案2】:

    CheckUpDown 有a nice explanation of the 504 error:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          我观察到的关于此错误的一件事是,它仅出现在来自服务器的第一个响应中,如果是 http,则应该是握手响应。一旦立即响应从服务器发送到网关,如果在主响应花费时间之后它不会给出错误。这里的关键是服务器对请求的第一个响应应该很快。

          【讨论】:

            【解决方案6】:

            我遇到了另一个问题,给了我一个 504。它很遥远,但我会在这里为谷歌员工和后代写下来......

            我有一个客户端调用托管在另一个域 (Active Directory) 中的 IIS 托管 Web 服务。客户端域与托管 Web 服务的域之间没有完全信任。 这两个域之间的选择性信任的众多挑战之一是 Kerberos 在从一个域调用到另一个域时不起作用。

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

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

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

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

            【讨论】:

              猜你喜欢
              • 2014-09-30
              • 2022-11-29
              • 2013-12-28
              • 1970-01-01
              • 1970-01-01
              • 2010-12-27
              • 2011-01-01
              • 2014-01-08
              • 2018-03-05
              相关资源
              最近更新 更多