[解決済み] HttpClientの単一インスタンスで異なる認証ヘッダを使用する場合
質問
.net の HttpClient は再利用を念頭に置いて設計されており、次のようなことを意図しています。 長寿 と メモリリークが報告されている が報告されています。複数のユーザーのためにエンドポイントを呼び出すときに、異なるベアラートークン (または任意の認証ヘッダー) を使用して特定のエンドポイントに restful 呼び出しを行いたい場合、どのようなガイド ラインがありますか?
private void CallEndpoint(string resourceId, string bearerToken) {
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", bearerToken);
var response = await httpClient.GetAsync($"resource/{resourceid}");
}
上記のコードがウェブアプリケーションの任意の数のスレッドによって呼び出される可能性があることを考えると、最初の行で設定されたヘッダーがリソースを呼び出すときに使用されるものと同じでないことは容易にあり得ます。
ロックを使用して競合を引き起こすことなく、ステートレスなWebアプリケーションを維持するために、単一のエンドポイントのHttpClientsを作成および廃棄する推奨されるアプローチは何ですか (私の現在の実践は、エンドポイントごとに単一のクライアントを作成することです)。
ライフサイクル
HttpClient は IDisposable インターフェースを間接的に実装しています。 インターフェイスを実装していますが、推奨される HttpClient の使用法は、リクエストのたびにそれを破棄しないことです。 を廃棄しないことです。HttpClient オブジェクトは、アプリケーションが HTTP 要求を行う必要がある限り オブジェクトは、アプリケーションが HTTP リクエストを作成する必要がある限り、存続させることを目的としています。オブジェクトを複数のリクエストにまたがって存在させることで オブジェクトが複数のリクエストにまたがって存在することで また、CredentialCache や CookieContainer などの設定を変更する必要がなくなります。 のようにリクエストごとに CredentialCache や CookieContainer などの設定をし直す必要がなくなります。 HttpWebRequestで必要だったように、リクエストごとにCredentialCacheやCookieContainerなどを再定義する必要がなくなります。
どのように解決するのですか?
ヘッダが通常同じになるのであれば、ヘッダに
DefaultRequestHeaders
. しかし、ヘッダを指定するためにそのプロパティを使用する必要はありません。あなたが判断したように、同じクライアントを複数のスレッドで使用する場合、 それはうまくいかないでしょう。あるスレッドで行われたデフォルトのヘッダへの変更は、他のスレッドで送信されたリクエストに影響を与えるでしょう。
クライアントでデフォルトのヘッダを設定し、各リクエストにそれを適用することはできますが、ヘッダは実際にはリクエストのプロパティです。そのため、ヘッダがリクエストに固有のものである場合は、リクエストに追加するだけでよいでしょう。
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
つまり
HttpRequest
. を使う必要があります。
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
文書化 ここで .
ヘッダを更新するコードをメソッドの残りの部分から分離するために、拡張メソッドを使用することが有用であることを発見した人もいます。
リクエストヘッダを操作できる拡張メソッドを通して行われるGETとPOSTメソッドの例と、より多くの
HttpRequestMessage
を送信する前に操作することができます。
public static Task<HttpResponseMessage> GetAsync
(this HttpClient httpClient, string uri, Action<HttpRequestMessage> preAction)
{
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);
preAction(httpRequestMessage);
return httpClient.SendAsync(httpRequestMessage);
}
public static Task<HttpResponseMessage> PostAsJsonAsync<T>
(this HttpClient httpClient, string uri, T value, Action<HttpRequestMessage> preAction)
{
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri)
{
Content = new ObjectContent<T>
(value, new JsonMediaTypeFormatter(), (MediaTypeHeaderValue)null)
};
preAction(httpRequestMessage);
return httpClient.SendAsync(httpRequestMessage);
}
これらは、次のように使うことができる。
var response = await httpClient.GetAsync("token",
x => x.Headers.Authorization = new AuthenticationHeaderValue("basic", clientSecret));
関連
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】HttpClientとHttpClientHandlerはリクエストの間にディスポされなければならないのでしょうか?
-
[解決済み】Web APIからHttpClientでJsonObjectをPOSTする。
-
[解決済み】複数のタスクを待機させ、異なる結果を得ることができる。
-
[解決済み] HttpClientにHttpヘッダを追加する
-
[解決済み] HttpClientのヘッダを追加すると、ある値でFormatExceptionが発生する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] 2つのリストを結合する
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】プロセスが実行されているかどうかを知るには?