次の方法で共有


.NET Framework 4.5 に基づく大規模な HttpWebRequest POST または PUT のメモリ最適化

この記事は、 HttpWebRequest クラスを使用して HTTP POST または PUT 要求に大量のデータを送信するときに発生する問題を解決するのに役立ちます。

元の製品バージョン: .NET Framework 4.5
元の KB 番号: 2855735

症状

HttpWebRequest クラスを使用して HTTP POST または PUT 要求に対して大量のデータを送信すると、Microsoft .NET Framework を実行しているコンピューターで要求が失敗する可能性があります。 さらに、メモリ不足の例外が発生する場合があります。

HttpWebRequest クラスを使用するアプリケーションが大量のメモリを消費していることに気付くかもしれません。 パフォーマンス モニターを使用してHttpWebRequest クラスを使用するアプリケーションを監視すると、データの送信時にプライベート バイト数が増加し続けます。

原因

この問題は、 HttpWebRequest クラスを使用すると、.NET Framework によって既定で送信データがバッファーされるために発生します。 HttpWebRequest クラスを使用して大量のデータを送信すると、POST または PUT 要求が失敗し 元の問題が文書化されます。

解決策

この問題を回避するには、 HttpWebRequest.AllowWriteStreamBuffering プロパティを false に設定します。 これにより、POST または PUT 要求の送信データ (エンティティ本文) がメモリにバッファーされません。

4.5 より前のバージョンの .NET Framework では、 HttpWebRequest.AllowWriteStreamBuffering プロパティを false に設定すると、認証されたエンドポイントにデータをアップロードするときにエラーが発生することがあります。 たとえば、この要求が成功するにはデータのバッファリングが必要ですメッセージが表示されたSystem.Net.WebExceptionが発生する場合があります。 ただし、より詳細な調査では、例外に関連付けられている応答は実際には System.Net.HttpStatusCode.Unauthorized (401) の状態コードを示します。 HTTPWebRequest クラスを使用して大量のデータを送信すると、POST または PUT 要求が失敗します 401 応答を処理するための事前認証と KeepAlive 接続の回避策について説明します。

.NET Framework 1.1、2.0、3.0、3.5、4.0 とは異なり、.NET Framework 4.5 では、 HttpWebRequest.AllowWriteStreamBuffering プロパティの新しいデザイン機能が追加されます。 新しい機能は、 Expect100Continue 機能が有効になっている限り、認証シナリオを直接処理できます。 既定の ServicePointManager.Expect100Continue 値は true です。

詳細情報