2011-06-02 151 views
10

这里是我的代码:ASP.NET的Response.Redirect()错误

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: Thread was being aborted.\r\n at System.Threading.Thread.AbortInternal()\r\n at System.Threading.Thread.Abort(Object stateInfo)\r\n at 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

谁能告诉我为什么这个错误发生?

回答

19

你可以简单地移动....

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

...的try/catch块,或者你外面可以试试下面John S. Reid's newer solution

Response.Redirect(url) ThreadAbortException Solution


by John S. Reid
March 31, 2004
(edited October 28, 2006 to include greater detail and fix some inaccuracies in my analysis, though the solution at it's core remains the same)

...跳绳下来.. 。

The ThreadAbortException is thrown when you make a call to Response.Redirect(url) because the system aborts processing of the current web page thread after it sends the redirect to the response stream. Response.Redirect(url) actually makes a call to Response.End() internally, and it's Response.End() that calls Thread.Abort() which bubbles up the stack to end the thread. Under rare circumstances the call to Response.End() actually doesn't call Thread.Abort(), but instead calls HttpApplication.CompleteRequest(). (See this Microsoft Support article for details and a hint at the solution.)

...,蹦蹦跳跳地走......

PostBack and Render Solutions? Overrides.

The idea is to create a class level variable that flags if the Page should terminate and then check the variable prior to processing your events or rendering your page. This flag should be set after the call to HttpApplication.CompleteRequest(). You can place the check for this value in every PostBack event or rendering block but that can be tedious and prone to errors, so I would recommend just overriding the RaisePostBackEvent and Render methods as in the code sample1 below:

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); 
} 

The Final Analysis

Initially I had recommended that you should simply replace all of your calls to Response.Redirect(url) with the Response.Redirect(url, false) and CompleteRequest() calls, but if you want to avoid postback processing and html rendering you'll need to add the overrides as well. From my recent in depth analysis of the code I can see that the most efficient way to redirect and end processing is to use the Response.Redirect(url) method and let the thread be aborted all the way up the stack, but if this exception is causing you grief as it does in many circumstances then the solution here is the next best thing.

It should also be noted that the Server.Transfer() method suffers from the same issue since it calls Response.End() internally. The good news is that it can be solved in the same way by using the solution above and replacing the call to Response.Redirect() with Server.Execute().

1 - 我修改了代码格式以使它适合SO界限,所以它不会滚动。

+0

嘿,你的块引用说“*当你调用Response.Redirect(url)... *”时引发ThreadAbortException,你还记得你从哪里得到的?我无法通过Google找到该报价的原始来源,因为它实际上被多个人抄袭了很多':/' – 2014-08-16 07:30:50

+0

这是我能想到的最好的链接,但它不是原作者的作品或者,它链接并引用了作为作者的“John S. Reid”,从2004年3月31日起*:https://derekreynolds.wordpress.com/2009/10/27/using-response-redirect/。虽然原文似乎已经消失了。 – 2014-08-16 07:56:37

+3

感谢上帝的回来机器,我再次找到*原*的来源:[Response.Redirect(url)ThreadAbortException解决方案](https://web.archive.org/web/20120120110234/http://www.c6software .COM /用品/ ThreadAbortException.aspx)。 – 2014-08-16 08:37:19

相关问题