2024年4月27日 星期六

[研究]ASP.NET,Response.Redirect沒執行,錯誤訊息 "執行緒已經中止。"

[研究]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>");

(完)

相關

沒有留言:

張貼留言