首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

Response.Redirect 後仍執行後續程式碼導致「無法在傳送 HTTP 標頭後重導向」深度解析

     編輯:關於ASP.NET

常見誤區:以為 Response.Redirect(url) 會立即結束請求,實則不然。若呼叫 Redirect 後繼續執行程式碼再次 Redirect 或輸出內容,將拋出 Cannot redirect after HTTP headers have been sent。

問題重現

context.Response.Redirect("https://i.cnblogs.com/...");
// 後續仍有程式碼,甚至又呼叫 Redirect
return PageParser.GetCompiledPageInstance(...);

解決:Redirect 後立即 Return

context.Response.Redirect(...);
return null; // 關鍵:結束目前處理流程

.NET Framework 原始碼揭密

Response.Redirect(url) 內部呼叫 Redirect(url, true, false),endResponse=true 會呼叫 HttpResponse.End()。

End() 實作有兩條路徑:

  • _context.IsInCancellablePeriod == true(一般 Page/Controller):呼叫 AbortCurrentThread() 拋出 ThreadAbortException,中斷執行緒,**後續程式碼不會執行**。
  • _context.IsInCancellablePeriod == false(如 IHttpHandlerFactory.GetHandler 內):**不中斷執行緒**,改設定 _ended = true、Flush()、CompleteRequest(),**後續程式碼繼續執行**。

結論

在非 Page/Controller 環境(HttpModule、HttpHandler、Global.asax 等)使用 Response.Redirect **必須** 緊接 return 或 Context.ApplicationInstance.CompleteRequest(),否則標頭已送出導致二次重導向失敗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved