1. 程式人生 > >解決MVC3 伺服器無法在已傳送 HTTP 標頭之後設定狀態 問題

解決MVC3 伺服器無法在已傳送 HTTP 標頭之後設定狀態 問題

最近在檢視yifen.com網站的執行日誌,發現每天都有好幾M的日誌檔案,裡面都是同樣的錯誤如下:

    
2013-04-03 14:03:30,397 [13] ERROR Quan.Com.Controllers.CustomeExceptionAttribute [(null)] <(null)> - 發生時間:04/03/2013 14:03:30發生異常頁: http://www.yifen.com/memberinfo/ViewMyQuan/異常資訊: 伺服器無法在已傳送 HTTP 標頭之後設定狀態。錯誤源:System.Web堆疊資訊:   在 System.Web.HttpResponse.set_StatusCode(Int32 value)   在 System.Web.Mvc.HttpStatusCodeResult.ExecuteResult(ControllerContext context)   在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)--------------------------------------<br
>
2013-04-03 14:03:30,453 [13] ERROR Quan.Com.Controllers.CustomeExceptionAttribute [(null)] <(null)> - 出錯者IP:115.236.163.194
   

由於一開始就是學的MVC3,在之前也沒有相關處理經驗,網上查了很多資料都只是講應該在請求傳送到流之前做如下處理:

 

 Response.BufferOutput = true;

 

我在每一處跳轉的地方 都加上,但問題依舊

    
 Response.BufferOutput = true;  return Redirect("/member/logon");
   

這個問題其實不會影響網站的執行,程式碼執行後客戶端會跳轉成功,但是每次在檢視網站執行狀態的時候,都會看到如天書的異常資訊,實在很煩

 

既然伺服器已經在輸出HTTP標頭,那麼我可不可以把這個標頭資訊都清除,然後重新設定呢,想到這裡,我改進了一下程式碼並封裝了一個方法以後備用

    
1    public void RedirectUrl(string url)2         {3             this.Response.Clear();//這裡是關鍵,清除在返回前已經設定好的標頭資訊,這樣後面的跳轉才不會報錯4             this.Response.BufferOutput = true
;//設定輸出緩衝5             if (!this.Response.IsRequestBeingRedirected)//在跳轉之前做判斷,防止重複6             {7                 this.Response.Redirect(url, true);8             }9         }
   

搞定,世間清靜了很多。