web-dev-qa-db-ja.com

HttpClientとHttpWebRequest

Web APIクライアントに送信する必要がある大きなファイルがあります...データはマルチパートです。問題は、ファイルがHTTP Web要求を介して送信される場合、webapiに迅速にアップロードされることです。このリクエストの場合、ファイルの内容はリクエストストリームに直接書き込まれます。

同じファイルがHttpclient(.net 4.5)を介して送信される場合と同様に、http Web要求と比較するとアップロードが遅くなります。 Httpclient非同期後でmultipartformdatacontentを使用しています。

したがって、大きなファイルの場合、Webリクエストのみを使用する必要がありますか?または、Httpclientにアップロードを高速化する設定がありますか?

41
user2325247

HttpClientは、ヘッドレスブラウザのようなものです。多くのHTTPリクエストを作成する場合、強力で理想的なツールです。たとえば、デフォルトのヘッダーなどを設定できます。 here から取得されるHttpWebRequestと異なる上位5つの方法を次に示します。

  1. HttpClientインスタンスは、拡張機能の構成、デフォルトヘッダーの設定、未処理のリクエストのキャンセルなどを行う場所です。
  2. 単一のHttpClientインスタンスを介して、必要な数のリクエストを発行できます。
  3. HttpClientsは特定のHTTPサーバーまたはホストに関連付けられていません。同じHttpClientインスタンスを使用してHTTPリクエストを送信できます。
  4. HttpClientから派生して、特定のサイトまたはパターンに特化したクライアントを作成できます。
  5. HttpClientは、非同期リクエストの処理に新しいタスク指向のパターンを使用して、複数の未処理リクエストの管理と調整を劇的に簡単にします。
43
Krimson

FileClientContentをhttpclientとともに使用していましたが、ByteArrayContentを使用したときは正常に機能しました。

どうしてこれが違いを生んだのかはわかりませんが、ストリームを送信するよりも、ストリームを介してバイトを送信する方が良い方法です

3
user2325247

おそらく、パフォーマンス問題を説明できるusingブロックでHttpClientをインスタンス化していたのでしょう。例えば。

  using (var httpClient = new HttpClient() )
  {
      var result = await httpClient.GetAsync("http://example.com");
      Console.WriteLine(result.StatusCode);
  }

ここで、HttpClientのインスタンスは、リクエストの直後に破棄されますが、おそらく、存続期間の長いオブジェクト(たとえば、アプリケーションの有効期間)でなければなりません。

[編集-追加されたコンテキスト]

インスタンスを破棄すると接続も閉じられますが、設定された期間、ソケットは待機状態のままになります。このコードを実行するたびに、OSは新しいソケット接続を作成しようとしますが、これを完了する速度には制限があるため、パフォーマンス/信頼性の問題が発生する可能性があります。

同じHttpClientインスタンスを再利用するということは、開いているソケットの再利用とシステムリソースのより効率的な使用を意味します。

詳細 こちら

3
mounds