[研究]ASP.NET,Response.Redirect沒執行,錯誤訊息 "執行緒已經中止。"
2024-04-27
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19
********************************************************************************
執行緒已經中止。
ERRORSHELPABOUT
System.Threading.ThreadAbortException
執行緒已經中止。
System.Threading.ThreadAbortException: 執行緒已經中止。
於 System.Web.HttpContext.InvokeCancellableCallback(WaitCallback callback, Object state)
於 System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action)
********************************************************************************
GPT-4 Copilot
您遇到的問題是 ASP.NET 中的一個常見情況。當使用 Response.Redirect 或 Server.Transfer 時,內部會調用 Response.End,而這會中止正在執行的線程。為了解決這個問題,您可以採取以下兩種方法之一:
1.使用 HttpContext.Current.ApplicationInstance.CompleteRequest():
在使用 Server.Transfer 時,您可以使用 Server.Execute 作為替代方法。這樣可以避免 ThreadAbortException。
例如:
Response.Redirect(url, false); Context.ApplicationInstance.CompleteRequest(); |
這樣,您可以告訴 IIS 管道在返回控制後直接進入 EndRequest 階段。
2.使用 Response.Redirect 的多載方法:
使用多載方法 Response.Redirect(string url, bool endResponse),將 endResponse 參數設置為 false。
這樣可以隱藏對 Response.End 的內部調用。
例如:
Response.Redirect(url, false); Context.ApplicationInstance.CompleteRequest(); |
這樣不會引發 ThreadAbortException,但您需要負責在事件處理程序中提前返回控制,以避免其他代碼的執行。
********************************************************************************
結果 Elmah 雖然沒有報告問題,但是 Response.Redirect 無效,不太清楚外包商如何搞的,這個方案某些地方用 Response.Redirect 就是無效,外包商自己到處都是用 Response.Write,而非用 Response.Redirect。
後來用 Response.Write 代替 Response.Redirect 重導網址
Response.Write("<script>window.location='WebForm1.aspx';</script>");
|
成功。
註:下面方法或可考慮(尚未實際測試)
Response.Write("<script>window.open('WebForm1.aspx', '_blank');</script>");
Response.Write("<script>window.location.href = 'WebForm1.aspx';</script>");
相關
沒有留言:
張貼留言