[解決済み】HttpClientとHttpClientHandlerはリクエストの間にディスポされなければならないのでしょうか?
質問
System.Net.Http.HttpClient と System.Net.Http.HttpClientHandler は、.NET Framework 4.5 で IDisposable を実装しています (via. System.Net.Http.HttpMessageInvoker ).
は
using
文のドキュメントに書かれています。
IDisposableオブジェクトを使用する場合、原則として、宣言と のインスタンスを作成します。
この回答 はこのパターンを使用しています。
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
しかし、マイクロソフトの最も目につく例では、このように
Dispose()
明示的にも暗黙的にも。例えば
- は ブログオリジナル記事 HttpClientのリリースのお知らせです。
- 実際の MSDNドキュメント HttpClientのためのものです。
- BingTranslateSample(ビングトランスレートサンプル
- GoogleMapsSample
- ワールドバンクサンプル
での お知らせ のコメントで、マイクロソフトの社員に質問した人がいました。
<ブロッククオートサンプルを確認したところ、disposeを実行していないようです。 アクションを実行します。私はHttpClientのすべてのインスタンスを使用しています。 私のアプリでは、usingステートメントを使用しており、それが正しい方法だと考えています。 HttpClientはIDisposableインターフェイスを実装しているからです。私は 正しい道ですか?
彼の答えはこうだった。
一般的にはその通りですが、注意しなければならないのは .Net 4.5では、usingとasyncは混在しないので、usingとasyncは混在しない。 は "using" 文の中で "await" を使用することができます。
ちなみに、同じHttpClientは何度でも再利用可能です。 通常、常に作成/廃棄することはありません。
この質問では、HttpClientインスタンスを何回使えるかではなく、不要になった後にそれを廃棄する必要があるかどうかを尋ねています。
(更新: 実はこの2番目の段落が、@DPedenによって以下に提供されているように、答えの鍵なのです)
そこで質問なのですが
-
現在の実装(.NET Framework 4.5)では、HttpClientとHttpClientHandlerのインスタンスに対してDispose()を呼び出す必要があるのでしょうか?明確化:必要性とは、リソースリークやデータ破損のリスクなど、ディスポーズしないことによる悪影響があるかどうかという意味です。
-
必要ないのであれば、IDisposableを実装しているので、とりあえず"good practice"になるのでしょうか?
-
必要(または推奨)である場合、それは このコード は、それを安全に実装していますか(.NET Framework 4.5の場合)?
-
これらのクラスが Dispose() を呼び出す必要がないのであれば、なぜ IDisposable として実装されたのでしょうか?
-
もしそれが必要なら、あるいは推奨されるプラクティスなら、Microsoft の例は誤解を招いたり安全でなかったりしますか?
どのように解決するのですか?
一般的なコンセンサスは、HttpClient を破棄する必要はない(はず)、というものです。
その仕組みに深く関わっている多くの人が、このように発言しています。
参照 ダレル・ミラーのブログ記事 と関連するSOの記事です。 HttpClientのクローリングでメモリリーク発生 を参考にしてください。
を読むことを強くお勧めします。 のHttpClientの章をご覧ください。 ASP.NETで進化するWebAPIをデザインする 特に、ここで引用されている "Lifecycle" のセクションは、ボンネットの下で何が起こっているのかについてのコンテキストを提供しています。
<ブロッククオートHttpClientはIDisposableを間接的に実装していますが インターフェイスを使用しますが、HttpClientの標準的な使用法は、それを廃棄することではありません。 を使用します。HttpClient オブジェクトは、以下の期間、使用されます。 アプリケーションがHTTPリクエストを行う必要がある限り。オブジェクトを持つこと 複数のリクエストにまたがって存在することで DefaultRequestHeadersを再指定する必要がありません。 のように、リクエストごとにCredentialCacheやCookieContainerのように は、HttpWebRequest で必要でした。
DotPeekを開くのもいい。
関連
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] SelectとSelectManyの違い
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み] C#を使用してREST APIの呼び出しを行うには?
-
[解決済み】HttpClientのHttpRequestMessageにCookieを設定する方法
-
[解決済み] HttpClientにHttpヘッダを追加する
-
[解決済み] HttpClientは同時に使っても大丈夫ですか?
-
[解決済み] WebAPIクライアントで、呼び出しごとに新しいHttpClientを作成する場合のオーバーヘッドを教えてください。
-
[解決済み] 非同期I/Oの同時処理量を制限するには?