Asp.net-Mvc
IIS7.5 發送 HTTP 標頭後伺服器無法設置狀態
有時我在生產環境中遇到異常:
- 處理資訊 + 程序 ID:3832 + 程序名稱:w3wp.exe + 帳戶名稱:NT AUTHORITY\NETWORK SERVICE
- 異常資訊 + 異常類型:System.Web.HttpException + 異常消息:發送 HTTP 標頭後伺服器無法設置狀態。
- 索取資料 + 請求網址:http ://www.myulr.pl/logon + 請求路徑:/logon + 使用者主機地址:10.11.9.1 + 使用者:user001 + 已通過身份驗證:真 + 身份驗證類型:表格 + 執行緒帳戶名稱: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 的原因:
- 您的操作正在執行,將標記寫入響應流
- 流是無緩衝的,迫使響應標頭在標記寫入開始之前被寫入。
- 您的視圖遇到了執行時錯誤
- 異常處理程序開始嘗試將狀態程式碼設置為其他非 200
- 失敗,因為標頭已經發送。
我不同意 Vagrant 的地方是“在綁定中沒有錯誤”補救措施 - 您仍然可能在視圖綁定中遇到執行時錯誤,例如空引用異常。
一個更好的解決方案是確保
Response.BufferOutput = true;在任何字節被發送到響應流之前。例如,在您的控制器操作或應用程序中的 On_Begin_Request 中。這使得伺服器傳輸、cookies/headers 設置等正確,直到自然結束響應,或呼叫 end/flush。當然,還要檢查緩衝區是否也沒有在堆棧中被刷新/設置為 false。
MSDN 參考: HttpResponse.BufferOutput