簡體   English   中英

在WinRT的HttpClient類中使用Keep-Alive連接?

[英]Using a Keep-Alive connection in WinRT's HttpClient class?

打開與服務器的連接時,我們的WinRT應用程序速度極慢。 請求需要大約500毫秒才能運行。 這阻礙了我們的一些場景。

在調試時,我們注意到當Fiddler處於活動狀態時,請求要快得多 - 每個請求約100ms。 稍后我們理解這是因為Fiddler在代理呼叫時使用了Keep-Alive連接,這使我們的代理呼叫更快。

我們以兩種方式對此進行了雙重檢查。

  1. 我們將UseProxy設置為false,並觀察到請求變回緩慢。
  2. 我們關閉了Fiddler的“重用連接”選項,並觀察到請求恢復得很慢。

我們嘗試通過Connection頭啟用keep-alive(.Connection.Add(“Keep-Alive”))但這似乎沒有任何影響 - 事實上,.NET組件似乎公然忽略了標頭,並且沒有按要求發送(再次通過Fiddler檢查)。

有誰知道如何在Windows 8,WinRT,HttpClient類中為請求設置keep-alive?

以下設置正確的標題為我啟用keep-alive(客戶端是一個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");

如果你想關閉keep-alive,請使用

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

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

在幕后HttpClient使用HttpWebRequest,它可以讓你直接訪問KeepAlive但是因為你正在瀏覽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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM