3

當我們的服務器打開連接時,我們的WinRT應用程序非常慢。請求需要〜500ms運行。這阻礙了我們的一些場景。在WinRT的HttpClient類中使用Keep-Alive連接?

調試時,我們注意到當Fiddler處於活動狀態時,請求速度要快得多 - 每個請求約100ms。一些搜索後來我們明白這是因爲Fiddler在代理呼叫時使用Keep-Alive連接,這使得我們的代理呼叫速度更快。

我們用兩種方法對此進行了仔細檢查。

  1. 我們將UseProxy設置爲false,並觀察到請求返回的速度很慢。
  2. 我們關閉了Fiddler的「重新使用連接」選項並觀察到請求回覆緩慢。

我們嘗試通過Connection頭(.Connection.Add(「Keep-Alive」))啓用保持活動,但這似乎沒有任何影響 - 事實上,頭似乎被公然忽略.NET組件,並且不會根據請求發送(再次通過檢查Fiddler)。

有誰知道如何在Windows 8,WinRT,HttpClient類中設置保持活動狀態嗎?

+0

盡我所能找到現在的問題是: http://stackoverflow.com/questions/14099812/httpclient-exception-in-windows-8-app 也爲您的閱讀快感: HTTP:// MSDN .microsoft.com/en-us/library/system.net.http.headers.httprequestheaders.aspx 您使用的是HTTP 1.1版嗎?在這種情況下,Keep-Alive應該默認爲true。 – 2013-03-05 00:22:34

+0

是的,使用1.1。感謝這些鏈接,儘管我沒有看到第一個如何應用 - 我們沒有收到錯誤。至於第二個 - 我在我的問題中指出,我們嘗試使用連接標題 - 我不知道如何完整的標題列表是有幫助的(對不起)。 – 2013-03-05 06:05:56

+0

嘿嘿,我知道,但是你永遠不知道第二眼看什麼:-)祝你好運! – 2013-03-05 09:36:31

回答

1

嘗試使用HttpContent類添加標題 - 這樣的基礎上(但未經測試)http://social.msdn.microsoft.com/Forums/en-CA/winappswithcsharp/thread/ce2563d1-cd96-4380-ad41-6b0257164130

HttpClient的使用HttpWebRequest的場景,這將使您直接進入保活,但因爲你正在經歷的HttpClient你身後無法直接訪問HttpWebRequest類中的該屬性。

 

public static async Task KeepAliveRequest() 
{ 
    var handler = new HttpClientHandler(); 
    var client = new HttpClient(handler as HttpMessageHandler); 

    HttpContent content = new StringContent(post data here if doing a post); 
    content.Headers.Add("Keep-Alive", "true"); 

    //choose your type depending what you are sending to the server 
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 

    HttpResponseMessage response = await client.PostAsync(url, content); 

    Stream stream = await response.Content.ReadAsStreamAsync(); 

    return new StreamReader(stream).ReadToEnd(); 
} 
 

編輯 由於您只想GET,你可以做到這一點:

 

public static async Task KeepAliveRequest(string url) 
{ 
    var client = new HttpClient(); 
    var request = new HttpRequestMessage() 
    { 
     RequestUri = new Uri("http://www.bing.com"), 
     Method = HttpMethod.Get, 
    }; 
    request.Headers.Add("Connection", new string[] { "Keep-Alive" }); 
    var responseMessage = await client.SendAsync(request); 
    return await responseMessage.Content.ReadAsStringAsync(); 
} 

 
+0

感謝您的答案亞當... 1.我們不做POST,我們正在做GETs和服務器驗證,所以我們不能切換到POST)2.你爲什麼要做「作爲HttpMessageHandler」你的HttpClientHandler ? HttpClientHandler是HttpMessageHandler。 – 2013-03-05 08:26:14

+0

我們嘗試通過DefaultHeaders和HttpRequestMessage中的更改添加Keep-Alive頭。但是我們沒有直接在請求對象上嘗試它。我會嘗試,但由於其他兩種方法沒有在請求上放置標題,所以我沒有很高的期望。 – 2013-03-05 20:13:36

+0

我在winrt應用程序中測試了GET請求的上述確切代碼,並且獲取Connection:Keep-Alive作爲唯一的請求標頭。 '在我的機器上工作':) – 2013-03-06 06:28:45

5

以下設置正確的頭開啓保持活動,我(客戶端是一個HttpClient的)

client.DefaultRequestHeaders.Connection.Clear(); 
client.DefaultRequestHeaders.ConnectionClose = false; 
// The next line isn't needed in HTTP/1.1 
client.DefaultRequestHeaders.Connection.Add("Keep-Alive"); 

如果你想打開保活過,使用

client.DefaultRequestHeaders.Connection.Clear(); 
client.DefaultRequestHeaders.ConnectionClose = true;