5

サーバーへの接続を開くと、WinRT アプリが非常に遅くなります。リクエストの実行には最大 500 ミリ秒かかります。これにより、一部のシナリオがブロックされています。

デバッグ中に、Fiddler がアクティブな場合、リクエストがはるかに高速であることに気付きました (1 リクエストあたり最大 100 ミリ秒)。後でいくつかの検索を行ったところ、Fiddler が呼び出しをプロキシするときに Keep-Alive 接続を使用していたため、プロキシ呼び出しがはるかに高速になったためであることがわかりました。

これを 2 つの方法で再確認しました。

  1. UseProxy を false に設定すると、リクエストが低速に戻ることがわかりました。
  2. Fiddler の「接続の再利用」オプションをオフにすると、リクエストが再び低速になることがわかりました。

Connection ヘッダー (.Connection.Add("Keep-Alive")) を介してキープアライブを有効にしようとしましたが、これは効果がないようです。実際、ヘッダーは .NET コンポーネントによって露骨に無視されているようで、リクエストに応じて送信されていません(再び、Fiddlerを介して検査することにより)。

Windows 8、WinRT、HttpClient クラスでリクエストにキープアライブを設定する方法を知っている人はいますか?

4

2 に答える 2

9

以下は、キープアライブをオンにする正しいヘッダーを設定します (クライアントは 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;
于 2016-11-18T02:26:14.440 に答える
1

HttpContent クラスを使用してヘッダーを追加してみてください - このようなものに基づいています (ただしテストされていません) http://social.msdn.microsoft.com/Forums/en-CA/winappswithcsharp/thread/ce2563d1-cd96-4380-ad41-6b0257164130

舞台裏では、HttpClient は KeepAlive に直接アクセスできる 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();
}


于 2013-03-05T06:39:20.560 に答える