asp.net中服务器传输中的ThreadAbortException

时间:2014-10-27 09:40:12

标签: c# asp.net

我在执行行

时收到错误Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.
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);
    }
}

我仍然在out catch块中得到相同的异常

同样如http://support.microsoft.com/kb/312629/EN-US/所述,我使用了Server.Execute,但它没有重定向到Payment.aspx页面而只是刷新。

3 个答案:

答案 0 :(得分: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,请调用HttpContext.Current.ApplicationInstance.CompleteRequest方法而不是Response.End来绕过代码执行到Application_EndRequest事件。

  •   
  • 对于Response.Redirect,请使用Response.Redirect(String url, bool endResponse)false参数传递endResponse的重载,以禁止对Response.End的内部调用。例如:

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

答案 1 :(得分:0)

  

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

这对你有用。它会在传输代码之后停止剩余的剩余代码,这样它就不会执行该代码。

答案 2 :(得分:0)

引起ThreadAbortException异常,因为Response.End在Server.Redirect和Server.Transfer内部同时调用。尝试这样的事情

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