Response Buffer Limit Exceeded Error on IIS | WEBエンジニア社長のブログ

Response Buffer Limit Exceeded Error on IIS

IIS で ASP を使っていて次のエラーが出る場合:Response Buffer Limit Exceeded


以下、http://support.microsoft.com/kb/925764/ja から抜粋したものですが、もっと単純な理由だった、という経験を書きます。

結論からいうと、データベースに対してクエリを投げていたのですが、次のレコードへ移動する MoveNext を書き忘れていたために、Do Until~Loopが無限ループに入っていたためにおきたエラーでした。

webをいろいろ探したけど、このような原因を指摘しているケースがなかったので、ここでご紹介させていただきました。


[現象]

クライアント Web ブラウザからインターネット インフォメーション サービス (IIS) 6.0 を実行している Web サーバーに、ASP (Active Server Page) に対する要求が送信される状況を考えます。この ASP 要求によってサイズの大きな応答が生成されます。この場合、次の現象が発生することがあります。


・応答が正常に返されません。


・HTTP 500 サーバー エラーが発生し、次のエラー メッセージがクライアントの Web ブラウザに表示されます。

  Response オブジェクト エラー 'ASP 0251 : 80004005'
  Response Buffer Limit Exceeded
  Execution of the ASP page caused the Response Buffer to exceed its configured limit.

・IIS ログ ファイルの cs-uri-query フィールドに、次のエラーが出力されます。

  |0|ASP_0251_:_80004005|Response_Buffer_Limit_Exceeded



[原因]

この問題は、IIS 6.0 に導入され、IIS 5.0 に追加された動作上の変更が原因で発生します。この 2 つのバージョンの IIS では、デフォルトの ASP 応答バッファの上限が 4 MB に設定されます。この上限は、サイズの大きな ASP 応答によって Web アプリケーションをホストする IIS プロセスに悪影響が及ばないようにするためのものです。ASP 要求によって、設定されているバッファの上限を超えるサイズの大きな応答が生成された場合、「現象」に記載されている現象が発生します。


[解決方法]

ほとんどの場合、Web クライアントに送信される ASP 応答のバッファ サイズの上限は 4 MB で十分です。この上限を引き上げる必要がある場合は、以下のいずれかの方法を使用します。


方法 1 : 応答のサイズを小さくする
応答のサイズがデフォルト値の 4 MB を超えると、多くの場合、ユーザーはパフォーマンスの低下を感じます。Web ブラウザは、サイズの大きな応答をネットワーク経由で受信する必要があります。さらに、Web ブラウザは非常にサイズの大きな HTML 応答を解析し、表示する必要があります。


応答を受信する Web クライアントが、応答全体を単一のページとして表示する必要がない場合は、応答のサイズを小さくすることができます。たとえば、データがグリッドに表示されるように ASP ベースのアプリケーションを書き直すことができます。これにより、Web クライアントでは、そのデータを一度に 1 ページずつ表示できます。これは、Microsoft ASP.NET の GridView クラスを使用して実現できます。ASP.NET の GridView クラスの詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。

http://msdn2.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridview(VS.80).aspx


方法 2 : Response.Flush メソッドを使用する
ASP ファイルで、サイズの大きなテーブルの作成やデータの構成にループを使用している場合は、Response.Flush メソッドを使用できます。このメソッドを使用する場合も、バッファ処理を使用できます。ただし、Web クライアントに送信されるデータ量を完全に制御することもできるので、応答のバッファ サイズを制御できます。Response.Flush メソッドの詳細については、次の MSDN Web サイトを参照してください。

http://msdn2.microsoft.com/en-us/library/ms525560.aspx


方法 3 : バッファ処理を無効にする
Web サーバーでのバッファ処理を、アプリケーション レベルまたはページ レベルで無効にできます。バッファ処理を無効にすると、Web サーバーでは HTTP チャンク転送エンコードを使用して Web クライアントに応答を送信します。

アプリケーション レベルでバッファ処理を無効にするには、IIS メタベース プロパティの AspBufferingOn を使用できます。AspBufferingOn IIS メタベース プロパティの詳細については、次のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/iis/fbe1bd5f-52d4-4a26-8ab1-7bb897bb3d53.mspx (http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/iis/fbe1bd5f-52d4-4a26-8ab1-7bb897bb3d53.mspx )
ページ レベルでバッファ処理を無効にするには、Response.Buffer プロパティを使用できます。Response.Buffer プロパティの詳細については、次の MSDN Web サイトを参照してください。
http://windowssdk.msdn.microsoft.com/en-us/library/ms526001.aspx


方法 4 : バッファ サイズの上限を引き上げる
以下のいずれかの条件に該当する場合、バッファ処理の上限を引き上げることができます。
・クライアントが Web ブラウザではない。
・GridView クラスなどのページング テクノロジを利用するようにアプリケーションの設計を変更することができない。

バッファ サイズの上限を引き上げる必要がある場合、把握している最大の応答サイズを許容するようにバッファ サイズの上限を設定します。応答の最大サイズを事前に把握していない場合は、テスト中はバッファの制限を大きな値に設定してみます。テストの終了後、IIS ログ ファイルで、そのページに対して生成された応答に対応する sc-bytes フィールドを確認し、最も大きな値を使用します。

バッファ サイズの上限を引き上げるには、以下の手順を実行します。

1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[名前] ボックスに cmd と入力し、[OK] をクリックします。
2. 次のコマンドを入力し、Enter キーを押します。
  cd /d %systemdrive%\inetpub\adminscripts
3. 次のコマンドを入力し、Enter キーを押します。
  cscript.exe adsutil.vbs SET w3svc/aspbufferinglimit LimitSize

注 : LimitSize にはバッファ処理の上限をバイト単位で指定します。たとえば、67108864 という数値を使用すると、バッファ処理の上限サイズが 64 MB に設定されます。

バッファ サイズの上限が正しく設定されているかどうかを確認するには、以下の手順を実行します。

1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[名前] ボックスに cmd と入力し、[OK] をクリックします。
2. 次のコマンドを入力し、Enter キーを押します。
  cd /d %systemdrive%\inetpub\adminscripts
3. 次のコマンドを入力し、Enter キーを押します。
  cscript.exe adsutil.vbs GET w3svc/aspbufferinglimit



※このブログは、BSP ( ビジネスサポートサービス プロバイダー ) 小山内株式会社 代表取締役によって書かれています。




WEBエンジニア社長のタグクラウド

SQL Server    Management    Human    スタイルシート    ASP    リーダーシップ    マーケティング    ツイッター    IT