2014-10-27 24 views
2

在执行线ThreadAbortException在asp.net

Server.Transfer("Payment.aspx?vpc_ChannelId=2", true); 

,从而指出了这个答案https://stackoverflow.com/a/1252119/1169180 & https://stackoverflow.com/a/11130517/1169180

我改变了我的代码

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
    UserContext conObj = new UserContext(); 
    HttpContext CurrContext = HttpContext.Current; 
    if (!IsPostBack) 
    { 
     // Code 
    } 
    else 
    { 
     string userContext = hdnContextObj.Value; 
     conObj = JsonConvert.DeserializeObject<UserContext>(userContext); 
     CurrContext.Items.Add("Context", conObj); 
     try 
     { 
     Server.Transfer("Payment.aspx?vpc_ChannelId=2", true); 
     } 
     catch (ThreadAbortException xObj) 
     { 
     } 
     finally 
     { 
     Server.Transfer("Payment.aspx?vpc_ChannelId=2", true); 
     } 
    } 
    } 
    catch (Exception xObj) 
    { 
    Response.Write("Exception : " + xObj.Message); 
    } 
} 
我收到错误 Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.服务器转移

我仍然收到同样的例外,在捕捉块

也如这里指出的http://support.microsoft.com/kb/312629/EN-US/我用Server.Execute但它没有重定向到Payment.aspx页,而只是刷新。

+0

你的try/catch是什么都不做,你正赶上,然后reshowing相同的异常,这是一样的根本没有抓住它。如果你想吞下异常,那么不要扔进你的catch块。 – 2014-10-27 09:49:41

+0

@BenRobinson:即使我删除catch块的投掷。当行终于得到执行,异常获得最外面的catch块 – Shaggy 2014-10-27 10:08:06

回答

4

因为运行操作的线程被迫在多个终止的异常引发称为由于转移而导致的地点。因此,可以安全地忽略这个例外,因为你的链接的答案表明。

您可以通过捕获异常并不抛出它来忽略异常。

try 
{ 
    Server.Transfer("Payment.aspx?vpc_ChannelId=2", true); 
} 
catch(ThreadAbortException) 
{ 
    // Exception ignored: Thread Abort = discontinue processing on the current page 
} 

另外,作为MSDN文章建议,你可以使用Server.Execute代替。

要解决此问题,使用下列方法之一:

  • 对于Response.End,调用而不是Response.EndHttpContext.Current.ApplicationInstance.CompleteRequest方法绕过代码执行到Application_EndRequest事件。

  • 对于Response.Redirect,使用的过载,Response.Redirect(String url, bool endResponse),对于endResponse参数来抑制内部呼叫到Response.End传递false。例如:

    Response.Redirect ("nextpage.aspx", false); 
    

    如果使用此替代方法,将执行Response.Redirect之后的代码。

  • 对于Server.Transfer,请改为使用Server.Execute方法。

//澄清Server.Execute

MSDN DOC澄清的Server.Execute用法。记住这不是重定向很重要,它像一个函数调用一样。所以在调用之后的任何代码也会被执行。如果您不希望代码执行,则可以使用returnResponse.End

在OP的例子,在使用自己的代码可能是这个样子Server.Execute

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     UserContext conObj = new UserContext(); 
     HttpContext CurrContext = HttpContext.Current; 
     if (!IsPostBack) 
     { 
      // Code 
     } 
     else 
     { 
      string userContext = hdnContextObj.Value; 
      conObj = JsonConvert.DeserializeObject<UserContext>(userContext); 
      CurrContext.Items.Add("Context", conObj); 
      Server.Execute("Payment.aspx?vpc_ChannelId=2", true); 
      Response.End(); // or return; 
     } 
    } 
    catch (Exception xObj) 
    { 
     Response.Write("Exception : " + xObj.Message); 
    } 
} 
+0

我试着你的解决方案建议'Server.Execute'不重定向我的页面&当finally块得到执行它进一步抛出异常 – Shaggy 2014-10-27 10:13:51

+0

@Shaggy我已经添加了一个例子。记住,'Server.Execute'就像一个函数调用一样,它会将控制权返回给正在执行的应用程序。所以,你需要手动结束响应或者跳出一个程序。 – Kami 2014-10-27 10:24:59

+1

现在在'Response.End()'它使用'Server.Execute'后出现同样的错误 – Shaggy 2014-10-27 10:28:45

0

Server.Transfer(“Payment.aspx?vpc_ChannelId = 2”,false);

这将适用于你。它会在传输代码后停止其余代码,以便它不会执行该代码。

+0

我想保存表单数据。所以真实是必需的。 – Shaggy 2014-10-27 09:50:40

+0

好的,但我们可以看到其余的代码?因为这很可能是导致此问题的原因 – Koen 2014-10-27 10:05:49

+0

检查问题编辑 – Shaggy 2014-10-27 10:12:32

0

ThreadAbortException异常造成的,因为都到Response.End在Server.Redirect和Server.Transfer的internally.Try像这样

Response.Write("<script language=\"javascript\" type=\"text/javascript\">window.location.href = 'Your.aspx'; </script>"); 
+0

我想保留'context'对象。所以我想要的server.transfer – Shaggy 2014-10-27 10:11:21

相关问题