web-dev-qa-db-ja.com

C#HttpClient Keep-Aliveをfalseに設定する方法

.NETのHTTP要求でパフォーマンスの問題が発生しました。 localhostのREST APIへのHTTP GETリクエストは完了するまでに約500ミリ秒かかりました。修正に多くの時間を費やしました。さまざまな方法を試しました:HttpClientHttpWebRequestWebClient、およびRestSharp。これらはいずれも機能しません。インターネット上のほとんどのソリューションでは、Proxyパラメーターをnullに設定すると言われていますが、それでも高速には動作しません。

この時間を短縮することがわかった唯一の方法は、リクエストのKeep-Aliveパラメーターをfalseに設定することです。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.KeepAlive = false;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

これはうまく機能します。時間は7〜10ミリ秒に短縮されます。しかし、今ではいくつかの理由で、HttpClientの代わりにHttpWebRequestを使用する必要があります。 HttpClientのKeep-Aliveをfalseに設定する方法が見つかりません。私が見つけた唯一のことは、「connection」ヘッダーを「Keep-Alive」に設定することでtrueに設定する方法です。

POST HttpClientによるリクエストにこのコードを使用しています:

        HttpClient _http = new HttpClient();
        _http.DefaultRequestHeaders.Accept.Clear();
        _http.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
        _http.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600");

        var content = new StringContent(
            request, Encoding.UTF8, "application/%appname%+xml");
        content.Headers.ContentType.Parameters.Add(
            new NameValueHeaderValue("type", "payload"));

        HttpResponseMessage response = await _http.PostAsync(uri, content);

そして、完了するまでに約500〜600ミリ秒かかります。

21
Vaskrol

HttpWebRequest.KeepAlive = trueを設定すると、ヘッダーセットはConnection:keep-aliveになります

HttpWebRequest.KeepAlive = falseを設定すると、ヘッダーセットはConnection:closeです

だからあなたが必要になります

_http.DefaultRequestHeaders.Add("Connection", "close");
27
Jerry Joseph

このコードを使用して、クライアントでHTTPキープアライブを無効にします。

_http.DefaultRequestHeaders.ConnectionClose = true;

これにより、Connectionリクエストヘッダーがcloseに設定されます。

16
Pavel Chuchuva

以下のコードを参照してください:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
2
Riad Baghbanli

これがあなたの助けになることを願っています、私はテストしました

_client.DefaultRequestHeaders.Connection.Add("Keep-Alive");
0
Xiaoliang Sha

HttpClientHandlerを作成し、リクエストの直前にハンドラーでヘッダー「Connection」を削除しました。この場合、デフォルトの「接続:キープアライブ」を設定します。その前にデフォルトでHttpClientにそれを置いたとしても、プロパティなどを設定してください。ハンドラを確認してください。

0
Anton Ilyin