Web APIクライアントに送信する必要がある大きなファイルがあります...データはマルチパートです。問題は、ファイルがHTTP Web要求を介して送信される場合、webapiに迅速にアップロードされることです。このリクエストの場合、ファイルの内容はリクエストストリームに直接書き込まれます。
同じファイルがHttpclient(.net 4.5)を介して送信される場合と同様に、http Web要求と比較するとアップロードが遅くなります。 Httpclient非同期後でmultipartformdatacontentを使用しています。
したがって、大きなファイルの場合、Webリクエストのみを使用する必要がありますか?または、Httpclientにアップロードを高速化する設定がありますか?
HttpClient
は、ヘッドレスブラウザのようなものです。多くのHTTPリクエストを作成する場合、強力で理想的なツールです。たとえば、デフォルトのヘッダーなどを設定できます。 here から取得されるHttpWebRequest
と異なる上位5つの方法を次に示します。
FileClientContentをhttpclientとともに使用していましたが、ByteArrayContentを使用したときは正常に機能しました。
どうしてこれが違いを生んだのかはわかりませんが、ストリームを送信するよりも、ストリームを介してバイトを送信する方が良い方法です
おそらく、パフォーマンス問題を説明できるusing
ブロックでHttpClientをインスタンス化していたのでしょう。例えば。
using (var httpClient = new HttpClient() )
{
var result = await httpClient.GetAsync("http://example.com");
Console.WriteLine(result.StatusCode);
}
ここで、HttpClientのインスタンスは、リクエストの直後に破棄されますが、おそらく、存続期間の長いオブジェクト(たとえば、アプリケーションの有効期間)でなければなりません。
[編集-追加されたコンテキスト]
インスタンスを破棄すると接続も閉じられますが、設定された期間、ソケットは待機状態のままになります。このコードを実行するたびに、OSは新しいソケット接続を作成しようとしますが、これを完了する速度には制限があるため、パフォーマンス/信頼性の問題が発生する可能性があります。
同じHttpClientインスタンスを再利用するということは、開いているソケットの再利用とシステムリソースのより効率的な使用を意味します。
詳細 こちら 。