2015-11-18 54 views
0

我想了解如何處理keep-alive,尤其是服務器由於超時或使用單個套接字處理的請求的人爲限制而關閉保持活動連接時的「情況」。 我知道從關閉的套接字讀取將返回0.在這種情況下客戶端應該做什麼?它嘗試打開新的連接嗎?http keep-alive行爲 - 如何處理關閉的服務器套接字?

下面的測試代碼做定期執行HTTP請求:

while (true) 
{ 
    try 
    { 
     var httpResponse = await httpClient.GetAsync("https://192.168.1.22/api/v1/system/status/", cancellationToken); 
     if (httpResponse.IsSuccessStatusCode) 
     { 
      Console.Write("."); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("HttpClientGetStatus- Exception - " + ex.GetType() + " " + ex.Message); 
    } 
    Thread.Sleep(this.StatusFreq * 1000); 
} 

當套接字服務器關閉,我看不出有任何異常。這是否意味着當客戶端嘗試在內部打開一個新的套接字並且只要它工作,沒有任何事情(關於一箇舊的套接字被關閉,而是一個正在打開的新套接字)返回給用戶?我在哪裏可以找到規範或任何種類的描述正確http保持活動行爲的文章?

謝謝

回答

0

HTTP持久連接在this wikipedia article中有詳細說明。

但在你的情況下,你不必擔心套接字管理,因爲.Net HttpClient庫處理(和隱藏)所有這些低級別的東西。這就是爲什麼你沒有得到任何有關套接字重用的異常。

+0

我接受了答案。謝謝。爲了澄清,我是否正確理解當套接字關閉時,客戶端庫重試請求? –

+0

@MosheShmukler是的,我認爲是 – fiddler

1

我在哪裏可以找到規範或任何形式或者可能是文章描述正確的HTTP保持活動的行爲?

RFC2616 8.1節涉及持續連接,尤其是第8.1.4節「實際考慮」與您的問題有關。引用:

客戶端,服務器或代理可以在任何 時間關閉傳輸連接。 ...客戶端,服務器和代理必須能夠從異步關閉事件中恢復 。客戶端軟件應該重新打開 傳輸連接和重傳請求 的中止序列而無需用戶交互,只要請求序列是 冪等(參見9.1.2節)...

換句話說:如果客戶端在發送請求之前檢測到服務器端關閉,它應該簡單地爲下一個請求打開一個新連接。如果它在發送請求期間檢測到關閉,它應該只爲了冪等請求而重新啓動一個新的連接。

+0

Steffen Ullrich - 謝謝。多謝!!! –

相關問題