2008-11-04 94 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)屬性來解決他的問題。但是這通常不是一個好主意,如果你設置的值太高。這可能會隱藏真正的錯誤。你最好改進設計來真正解決這個問題。