2016-11-19 2 views
6

HttpClientを使用する場合のベストプラクティスについて多くのことを読んできました。ほとんどの人は、たとえそれがIDisposableであっても、アプリケーションの存続期間にわたってそれを再利用することを推奨します。異なるユーザー向けにHttpClientを再利用する

私のWebアプリケーションは、Facebook Graph API、Twitter API、Instagram APIなどのさまざまなAPIと通信しています。

通信するAPIごとに個別のHttpClientを作成することをお勧めします。これは、いくつかのヘッダーを再利用できるためです。

しかし、ここではTwitter APIを例に挙げて説明します。私のWebアプリケーションを使用する各ユーザーには、独自の認証ヘッダー(ユーザーにアクセスするアクセストークン)があります。これは、承認ヘッダをHttpClientオブジェクトのDefaultRequestHeadersに設定できないことを意味します。

異なる承認ヘッダーを持つ複数のユーザーにHttpClientを再利用する場合のベストプラクティスは何ですか?

リクエストごとにHttpRequestMessageオブジェクトを作成し、httpRequestMessageオブジェクトにデフォルトヘッダーであるhttpClient.DefaultRequestHeaders.Authorizationを設定する代わりに、承認ヘッダーを設定できますか?

ありがとうございました。

答えて

7

HttpClient(特にソケットの数)の作成にはいくらかのコストがかかりますので、HttpClientインスタンスを再利用するといくつかの利点があります。スレッドセーフでもあります。キーパターン(...、代わりに、より便利HttpClient.GetAsyncを使用する、PostAsyncHttpRequestMessageクラスを使用してHttpClient.SendAsyncメソッドを呼び出すことであるつのクライアント・インスタンスで複数の同時呼び出しの間に依存関係を持たないために

。このような

何か:

var request = new HttpRequestMessage() { 
    RequestUri = new Uri("http://api.twitter.com/someapiendpoint"), 
    Method = HttpMethod.Get 
} 
// set the authorization header values for this call 
request.Headers.Accept.Add(...); 

var response = await client.SendAsync(request); 

HttpRequestMessageのリクエストヘッダが(もうDefaultRequestHeadersはない)が使用されます。

+0

ありがとう、それはまさに私がやろうとしていたことです。 SendAsyncの終了後にHttpRequestMessageオブジェクトを処分することが無害であるかどうか知っていますか? – raRaRa

+0

@raRaRa - ようこそ。 ContentプロパティのHttpContent型がIDisposableなので、HttpRequestMessageはIDisposableを実装します。私は処分が(特にGET呼び出しのための)何らかの害を引き起こすべき理由を見ません。しかし、私はHttpRequestMessageインスタンスを直接処分することに直接手をつけていません。 –

関連する問題