常見誤區:以為 Response.Redirect(url) 會立即結束請求,實則不然。若呼叫 Redirect 後繼續執行程式碼再次 Redirect 或輸出內容,將拋出 Cannot redirect after HTTP headers have been sent。
context.Response.Redirect("https://i.cnblogs.com/...");
// 後續仍有程式碼,甚至又呼叫 Redirect
return PageParser.GetCompiledPageInstance(...);
context.Response.Redirect(...);
return null; // 關鍵:結束目前處理流程
Response.Redirect(url) 內部呼叫 Redirect(url, true, false),endResponse=true 會呼叫 HttpResponse.End()。
End() 實作有兩條路徑:
AbortCurrentThread() 拋出 ThreadAbortException,中斷執行緒,**後續程式碼不會執行**。_ended = true、Flush()、CompleteRequest(),**後續程式碼繼續執行**。在非 Page/Controller 環境(HttpModule、HttpHandler、Global.asax 等)使用 Response.Redirect **必須** 緊接 return 或 Context.ApplicationInstance.CompleteRequest(),否則標頭已送出導致二次重導向失敗。