由于代码已优化或本机框架位于调用堆栈的顶部,因此无法评估表达式


143

我收到错误消息:

由于代码已优化或本机框架位于调用堆栈的顶部,因此无法评估表达式。

我已在转发器的itemcommand事件中重定向到新页面。错误发生在以下行:

string url = "~/Galleries/AlbumImageList.aspx?UId=" + this.UserId.ToString() + "&AlbumId=" + e.CommandArgument.ToString();
Response.Redirect(url);

有人可以帮我吗?那里有什么问题吗?的_COMPlusExceptionCode是- 532459699

Answers:


162
Request.Redirect(url,false);

false 指示是否应终止当前页面的执行。


2
是否有类似Request.Redirect(url,false)的东西?
2013年

没有请求的重定向属性
karan

@karan您所使用的版本以及请求都将类似于“请求”
PrateekSaluja

125

使第二个参数为Response false,如下所示。

Response.Redirect(url,false);

67

解析度

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

病征

如果使用Response.End,Response.Redirect或Server.Transfer方法,则会发生ThreadAbortException异常。您可以使用try-catch语句来捕获此异常。

原因

Response.End方法结束页面执行,并将执行转移到应用程序的事件管道中的Application_EndRequest事件。Response.End之后的代码行未执行。

由于两个方法都在内部调用Response.End,因此在Response.Redirect和Server.Transfer方法中会发生此问题。

状态

此行为是设计使然。

物产

文章ID:312629-最新评论:2012年8月30日-修订:4.0

适用于

  • Microsoft ASP.NET 4.5
  • Microsoft ASP.NET 4
  • Microsoft ASP.NET 3.5
  • Microsoft ASP.NET 2.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0

关键字: kbexcepthandling kbprb KB312629

来源: PRB:如果您使用Response.End,Response.Redirect或Server.Transfer,则会发生ThreadAbortException


14

在一个错误中,我正在调查一个Response.Redirect(),它在意外的位置执行(读取:不适当的位置-成员属性getter方法内部)。

如果您要调试问题并遇到“ 无法评估表达式... ”异常:

  1. 执行搜索Response.Redirect()并使第二个参数endResponse = false,或者
  2. 暂时禁用重定向呼叫

这令人沮丧,因为它似乎在调试器上的“逐步通过”到达该位置之前执行了Redirect调用


13

请检查此链接以了解此问题的原因以及错误的解决方案:

http://support.microsoft.com/kb/312629/EN-US/

Microsoft支持文章:

PRB:如果您使用Response.End,Response.Redirect或Server.Transfer,则会发生ThreadAbortException。

要变通解决此问题,请使用以下方法之一:对于Response.End,请调用HttpContext.Current.ApplicationInstance.CompleteRequest方法而不是Response.End,以将代码执行绕过Application_EndRequest事件。

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

例如:Response.Redirect(“ nextpage.aspx”,false);

如果您使用此替代方法,则会执行Response.Redirect之后的代码。对于Server.Transfer,请改用Server.Execute方法。


3

我也有同样的问题,这很棘手。对我来说,这是因为我正在使用Ext.Js javascript库。如果您正在Ajax调用中访问的服务器端代码中执行response.redirect ,则存在问题。Ext.js的Ext.Redirect方法具有解决方法。


3

使用此代码解决问题:

string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Uploadfile\\" + fileName;
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();
Response.ContentType = "application/x-unknown/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName;+ "\"");
try
{
    if (bt != null)
    {
        System.IO.MemoryStream stream1 = new System.IO.MemoryStream(bt, true);
        stream1.Write(bt, 0, bt.Length);
        Response.BinaryWrite(bt);
        //Response.OutputStream.Write(bt, 0, (int)stream1.Length);
        Response.Flush();
        // Response.End();
    }
}
catch (Exception ex)
{
    Response.Write(ex.Message);
    throw ex;
}
finally
{
    Response.End();
}

5
对该代码的功能做一些更多的解释会很好。
Meryovi


2

只是为了防止其他人遇到我使用Response.End()一个异步触发按钮的问题

<asp:AsyncPostBackTrigger ControlID="btn_login" />

在更新面板中。我改用常规的发回邮件,虽然效果不是最好,但效果很好。

<asp:PostBackTrigger ControlID="btn_login" />. 

由于我只重定向页面,所以这是一个可行的解决方案。


2

如果您正在使用“更新面板”和链接按钮来下载excel,则在面板内部比添加回发触发器

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

并在内部click事件背后的代码中

string ServerPath = System.Configuration.ConfigurationManager.AppSettings["FilePath"] + "Template.xlsx";
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(ServerPath));

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
            HttpContext.Current.Response.ContentType = "application/octet-stream";
 HttpContext.Current.Response.TransmitFile(file.FullName);
 HttpContext.Current.Response.Flush();
 HttpContext.Current.ApplicationInstance.CompleteRequest();

1

使用这个,对我来说总是有用的。

Response.Redirect(Request.RawUrl, false);

在这里,Response.Redirect(Request.RawUrl)仅重定向到当前上下文的url,而第二个参数“ false”则指示是否响应endResponse。


1
欢迎使用Stackoverflow。请解释您的答案,它为什么起作用,如何解决问题,以便其他人可以轻松理解。
octobus

0

当您在mvc中有一个带有某些验证规则的模型的剃须刀页面时,可能会导致此问题。当您从表单发布而忘记在某些字段上显示验证错误时,则可能会出现此消息。推测:可能是您要发布到的方法与其他来源使用的方法不同,或者与服务原始请求的方法位于不同的地方。

因此,由于执行方式和模型状态不同(类似情况),因此由于不同而无法返回到原始页面以显示或处理错误。

可能很难发现,但容易犯错。确保您的接收方法实际上验证了所有可能的发布方法。

例如,即使您进行的服务器端验证实际上无法以大于验证所允许的最大值的形式编写字符串,也可能会有其他方式和来源发布到接收方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.