簡體   English   中英

ASP.NET Response.Redirect() 錯誤

[英]ASP.NET Response.Redirect( ) Error

這是我的代碼:

try
{
    Session["CuponeNO"] = txtCode.Text;
    txtCode.Text = string.Empty;
    Response.Redirect("~/Membership/UserRegistration.aspx");
}
catch(Exception ex)
{
   string s = ex.ToString();
   lblMessage1.Text = "Error Occured!";
}

我收到一個錯誤,即使它在捕獲后重定向。

這是錯誤:

"System.Threading.ThreadAbortException: 線程被中止。\r\n 在 System.Threading.Thread.AbortInternal()\r\n 在 System.Threading.Thread.Abort(Object stateInfo)\r\n 在 System.Web .HttpResponse.End()\r\n at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)\r\n at System.Web.HttpResponse.Redirect(String url)\r\n

誰能告訴我為什么會發生這個錯誤?

你可以簡單地移動......

Response.Redirect("~/Membership/UserRegistration.aspx");

...在 Try / Catch 塊之外,或者您可以嘗試以下John S. Reid 的更新解決方案

Response.Redirect(url) ThreadAbortException 解決方案


約翰·S·里德
2004 年 3 月 31 日
(2006 年 10 月 28 日編輯,在我的分析中包含更多細節並修復了一些不准確之處,盡管其核心解決方案保持不變)

……跳下去……

調用 Response.Redirect(url) 時會引發 ThreadAbortException,因為系統在將重定向發送到響應 stream 后會中止當前 web 頁面線程的處理。 Response.Redirect(url) 實際上在內部調用了 Response.End() ,而 Response.End() 調用了 Thread.Abort() ,它使堆棧冒泡以結束線程。 在極少數情況下,對 Response.End() 的調用實際上不會調用 Thread.Abort(),而是調用 HttpApplication.CompleteRequest()。 (有關詳細信息和解決方案的提示,請參閱此Microsoft 支持文章。)

……跳下去……

回發和渲染解決方案? 覆蓋。

這個想法是創建一個 class 級別的變量來標記頁面是否應該終止,然后在處理您的事件或呈現您的頁面之前檢查該變量。 此標志應在調用 HttpApplication.CompleteRequest() 之后設置。 您可以在每個 PostBack 事件或渲染塊中檢查此值,但這可能很乏味且容易出錯,因此我建議您只覆蓋 RaisePostBackEvent 和 Render 方法,如下面的代碼示例1所示:

 private bool m_bIsTerminating = false; protected void Page_Load(object sender, EventArgs e) { if (WeNeedToRedirect == true) { Response.Redirect(url, false); HttpContext.Current.ApplicationInstance.CompleteRequest(); m_bIsTerminating = true; // Remember to end the method here if there is more code in it. return; } } protected override void RaisePostBackEvent ( IPostBackEventHandler sourceControl, string eventArgument ) { if (m_bIsTerminating == false) base.RaisePostBackEvent(sourceControl, eventArgument); } protected override void Render(HtmlTextWriter writer) { if (m_bIsTerminating == false) base.Render(writer); }

最終分析

最初我建議您應該簡單地將所有對 Response.Redirect(url) 的調用替換為 Response.Redirect(url, false) 和 CompleteRequest() 調用,但是如果您想避免回發處理和 html 渲染,您將還需要添加覆蓋。 從我最近對代碼的深入分析中,我可以看到重定向和結束處理的最有效方法是使用 Response.Redirect(url) 方法並讓線程一直中止堆棧,但如果出現此異常就像在許多情況下一樣讓您感到悲傷,那么這里的解決方案是下一個最好的事情。

還應該注意的是,Server.Transfer() 方法也存在同樣的問題,因為它在內部調用了 Response.End()。 好消息是,可以通過使用上述解決方案並將對 Response.Redirect() 的調用替換為 Server.Execute() 以相同的方式解決。

1 - 我修改了代碼格式以使其適合 SO 邊界內,因此它不會滾動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM