2015-01-06 42 views
16

のために私は比較のために、いくつかの簡単なテストを行っていると私は見つけたいくつかの情報ははHttpClientをHttpWebRequestの対パフォーマンスとセキュリティ、および以下の接続

共有場合はシングルのHttpClientは、複数のリクエストで共有することができ、要求はしているました同じ宛先で、複数のリクエストが接続を再利用できる可能性があります。 WebRequestはリクエストごとに接続を再作成する必要があります。

私も使用する他の方法にいくつかのドキュメントを見上げHttpClientを例

次の記事では、私が試してみた

HttpWebRequest.UnsafeAuthenticatedConnectionSharing

可能な実装を共有し、高速NTLM認証接続を要約したもの以下に示す。

A)

private WebRequestHandler GetWebRequestHandler() 
{ 
    CredentialCache credentialCache = new CredentialCache(); 
    credentialCache.Add(ResourceUriCanBeAnyUri, "NTLM", CredentialCache.DefaultNetworkCredentials); 
    WebRequestHandler handler = new WebRequestHandler 
    { 
     UnsafeAuthenticatedConnectionSharing = true, 
     Credentials = credentialCache 
    }; 

    return handler; 
} 

using (HttpClient client = new HttpClient(GetWebRequestHandler(), false)) 
{ 
} 

私は、私は最大のパフォーマンスを達成するように取るべきアプローチを理解することの接続を最小限に抑え、必ずセキュリティがある作りで任意の助けをいただければ幸いです

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("some uri string") 

B)

using (HttpClient client = new HttpClient) 
    { 
    } 

C)影響を受けません。

+0

のHttpClientは、町の新しいクールな子供であり、それはおそらく、すべてのベストです、非同期/タスクをサポートし、よりもはるかにポータブルでありますその他(WebClientもあります)。ただし、.NET 4.5以上が必要です。言われているように、私はあなたが適切に使用された場合、生のパフォーマンスの面でそれらの間に多くの違いを見てはいけないと思う。 –

+1

私はHttpClientを使ってこの投稿を見ています[あなたはHTTPCLIENTを間違えて使用しており、あなたのソフトウェアを破壊しています](http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/) –

+0

は間違いなくHttpClientを使用すると、接続プール、非同期/待機ボックスを処理するだけでなく、HttpClientでユニットテストを書く方が簡単です。 – Duy

答えて

7

いずれかをasyncと併用すると、レスポンスを待っているリソースがブロックされず、スループットが向上するため、パフォーマンスの観点からは効果的です。

HttpClientは、非同期メソッドが用意されているため、HttpWebRequestよりも優先され、begin/endメソッドの作成について心配する必要はありません。

基本的に、(クラスのいずれかを使用して)非同期呼び出しを使用すると、応答を待っているリソースはブロックされず、他の要求はそのリソースを利用してさらに呼び出しを行います。

「使用」ブロックでHttpClientを使用して、他のWeb要求に対して同じリソースを何度も再利用できるようにすることを忘れないでください。

は、より多くの情報

Do HttpClient and HttpClientHandler have to be disposed?

+0

ちょうど、自分自身でHttpClientを処分する方法を学んだ。今、大きな議論になっているようです。長い話が短い、それを処分しないでください! – trnelson

0
  1. 実装 'A' に問題があるため、次のスレッドを参照してください。 GetWebRequestHandler()から返されたインスタンスの存続期間は短くなりました(例のためにおそらく?)。これが意図的に行われた場合、HttpClientコンストラクタの2番目のパラメータにはfalseが渡されます。 falseの値は、HttpClientに基底のHttpMessageHandlerをディスパッチしないように指示します(要求のポートを閉じないため、スケーリングに役立ちます)。これはもちろん、HttpMessageHandlerの存続期間が、ポートを開閉しない(サーバーのスケーラビリティに大きな影響を与える)利点を活用するのに十分長いと仮定しています。したがって、私はオプション 'D'の下に推奨を持っています。

  2. Httpclientインスタンスをにして、すべてのapi呼び出しで再使用するオプション 'D'もあります。これは、メモリ割り当てとGCの観点から、クライアント上のポートを開くことによって、はるかに効率的です。 HttpClientインスタンス(およびすべてのその基礎となるオブジェクト)のメモリを割り当て、作成するためのオーバーヘッドがなく、GCを介したクリーンアップも回避されます。

同様の質問について提供私の答えを参照してください - What is the overhead of creating a new HttpClient per call in a WebAPI client?

関連する問題