1. ホーム
  2. asp.net-mvc

[解決済み] HTTPヘッダを送信した後、サーバーがステータスを設定できない IIS7.5

2022-02-03 19:47:25

質問

本番環境では例外が発生することがあります。

  • プロセス情報
    • プロセスID:3832
    • プロセス名:w3wp.exe
    • アカウント名:NT AUTHORITY NETWORK SERVICE
  • 例外情報
    • 例外の種類:System.Web.HttpException
    • 例外メッセージです。 HTTPヘッダが送信された後では、サーバーはステータスを設定できない。
  • 資料請求
    • リクエストURLです。 http://www.myulr.pl/logon
    • リクエストパス:/logon
    • ユーザーホストアドレス:10.11.9.1
    • ユーザー:user001
    • 認証されている:True
    • 認証タイプ:フォーム
    • スレッドアカウント名:NT AUTHORITY NETWORK SERVICE
  • スレッド情報
    • スレッドID:10
    • スレッドアカウント名:NT AUTHORITY NETWORK SERVICE
    • なりすましています。偽
Stack trace: at System.Web.HttpResponse.set_StatusCode(Int32 value) at  
System.Web.HttpResponseWrapper.set_StatusCode(Int32 value) at  
System.Web.Mvc.HandleErrorAttribute.OnException(ExceptionContext filterContext) at  
System.Web.Mvc.ControllerActionInvoker.InvokeExceptionFilters(ControllerContext controllerContext, IList(1) filters, Exception exception) at  
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at  
System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4() at  
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0() at  
System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8(1).<BeginSynchronous>b__7(IAsyncResult _) at  
System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult(1).End() at   
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) at  
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at  
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& ompletedSynchronously) 

私のテスト環境ではこのエラーに気づかなかったのですが、何を確認すればよいのでしょうか?

ASP.NET MVC 2 (Release Candidate 2) を使用しています。

解決方法を教えてください。

原因については、Vagrantと大筋で同意見です。

  1. あなたのアクションが実行され、マークアップがレスポンスストリームに書き込まれました。
  2. ストリームがバッファリングされていないため、マークアップの書き込みを開始する前にレスポンスヘッダが書き込まれることになります。
  3. ビューでランタイムエラーが発生しました
  4. ステータスコードを200以外のものに設定しようとすると、例外ハンドラがキックされる
  5. ヘッダがすでに送信されているため、失敗。

私がVagrantに同意できないのは、quot;cause no errors in binding" remedy - ビューバインディングでヌル参照例外などの実行時エラーに遭遇する可能性があることです。

これに対するより良い解決策は Response.BufferOutput = true; たとえば、コントローラのアクションや アプリケーションの On_Begin_Request で、Response ストリームにバイトが送信される前に送信します。これにより、サーバー転送やクッキー/ヘッダーの設定など、 レスポンスを自然に終了させたり end/flush を呼び出したりすることができるようになります。

もちろん、バッファがフラッシュされていないか、スタックのもっと下のほうでfalseに設定されているかも確認します。

MSDNリファレンス。 HttpResponse.BufferOutput