我在执行行
时收到错误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
页面而只是刷新。
答案 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
的用法。重要的是要记住这不是重定向,它就像一个函数调用。因此,调用后的任何代码也将被执行。如果您不希望代码执行,可以使用return
或Response.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>");