无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部
Posted
技术标签:
【中文标题】无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部【英文标题】:Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack 【发布时间】:2011-01-03 17:32:46 【问题描述】:我收到错误:
。
我已在转发器的 itemcommand 事件中重定向到新页面。错误发生在以下行:
string url = "~/Galleries/AlbumImageList.aspx?UId=" + this.UserId.ToString() + "&AlbumId=" + e.CommandArgument.ToString();
Response.Redirect(url);
有人可以帮帮我吗?有什么问题吗?
_COMPlusExceptionCode
是 -532459699
。
【问题讨论】:
【参考方案1】:当您在 mvc 中使用具有某些验证规则的模型的剃须刀页面时,可能会出现此问题。当您从表单发布并且忘记在某些字段上显示验证错误时,可能会出现此消息。推测:这可能是因为您发布到的方法不同并且被其他来源使用,或者与服务原始请求的方法位于不同的位置。
所以因为不一样,所以不能返回原来的页面显示或者处理错误,因为执行和模型状态不一样(类似的东西)。
这可能有点难以发现,但很容易犯错。确保您的接收方法确实验证了所有可能的发布方式。
例如,即使您有服务器端验证,实际上无法在表单中写入大于验证允许的最大值的字符串,也可能有其他方式和来源发布到接收方法。
【讨论】:
【参考方案2】:使用这个,总是对我有用。
Response.Redirect(Request.RawUrl, false);
这里,Response.Redirect(Request.RawUrl) 只是简单地重定向到当前上下文的url,而第二个参数“false”表示是否endResponse。
【讨论】:
欢迎来到 ***。请解释你的答案,它为什么起作用它是如何解决问题的,以便其他人容易理解。【参考方案3】:如果您使用更新面板并且下载 excel 的链接按钮位于面板内,则添加回发触发器
<asp:PostBackTrigger ControlID="lnkTemplate" />
在代码后面的点击事件中
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();
【讨论】:
【参考方案4】:请查看此链接了解此问题的原因和错误解决方案:
http://support.microsoft.com/kb/312629/EN-US/
微软支持文章:
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 参数来抑制内部调用 响应。结束。
例如:Response.Redirect("nextpage.aspx", 假);
如果您使用此解决方法,则会执行 Response.Redirect 之后的代码。对于 Server.Transfer,使用 而是使用 Server.Execute 方法。
【讨论】:
【参考方案5】:分辨率
要解决此问题,请使用以下方法之一:
如需Response.End,请致电HttpContext.Current.ApplicationInstance.CompleteRequest() 方法而不是 Response.End 来绕过代码执行到 Application_EndRequest 事件。
对于 Response.Redirect,使用重载 Response.Redirect(String url, bool endResponse) 为 endResponse 传递 false strong> 参数来抑制对 Response.End 的内部调用。例如:
Response.Redirect ("nextpage.aspx", false);
如果您使用此解决方法,代码 后面的 Response.Redirect 被执行。对于Server.Transfer,请改用Server.Execute 方法。
症状
如果您使用 Response.End、Response.Redirect 或 Server.Transfer 方法,发生 ThreadAbortException 异常。你可以使用一个 try-catch 语句来捕获这个异常。
原因
Response.End 方法结束页面执行并将 执行到应用程序中的 Application_EndRequest 事件 事件管道。 Response.End 后面的代码行不是 执行。
这个问题出现在 Response.Redirect 和 Server.Transfer 方法,因为这两种方法都在内部调用 Response.End。
状态
此行为是设计使然。
属性
文章 ID:312629 - 上次审核:2012 年 8 月 30 日 - 修订:4.0
适用于
微软 ASP.NET 4.5 微软 ASP.NET 4 微软 ASP.NET 3.5 微软 ASP.NET 2.0 微软 ASP.NET 1.1 微软 ASP.NET 1.0关键字: kbexcepthandling kbprb KB312629
来源:PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer
【讨论】:
【参考方案6】:您也可以使用Server.Execute
【讨论】:
【参考方案7】:在我正在调查的一个错误中,有一个 Response.Redirect(),它在 意外位置 执行(阅读:不适当的位置 - 在成员属性 getter 方法内)。
如果您正在调试问题并遇到“无法评估表达式...”异常:
-
搜索
Response.Redirect()
并设置第二个参数endResponse = false,或者
暂时禁用重定向调用。
这令人沮丧,因为它似乎在调试器上的“单步执行”到达该位置之前执行 重定向调用。
【讨论】:
【参考方案8】:使Response
的第二个参数false如下所示。
Response.Redirect(url,false);
【讨论】:
【参考方案9】:只需将其他人遇到我使用 Response.End() 异步触发按钮时遇到的问题
<asp:AsyncPostBackTrigger ControlID="btn_login" />
在更新面板中。我改用常规回帖不是最好的,但它起作用了。
<asp:PostBackTrigger ControlID="btn_login" />.
因为我只是在页面上重定向,所以这是一个可行的解决方案。
【讨论】:
【参考方案10】:用这段代码解决问题:
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();
【讨论】:
多解释一下这段代码的作用会很好。【参考方案11】:Request.Redirect(url,false);
false
表示当前页面的执行是否应该终止。
【讨论】:
有没有类似Request.Redirect(url,false)的东西? 请求没有重定向属性 @karan 您正在使用的版本以及请求将类似于“请求”【参考方案12】:我也遇到了同样的问题,而且很棘手。对我来说,这是因为我使用的是 Ext.Js javascript 库。如果您在在 Ajax 调用中访问 的服务器端代码中执行 response.redirect,就会出现问题。 Ext.js 的 Ext.Redirect 方法有一个解决方法。
【讨论】:
以上是关于无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010 中的“无法评估表达式,因为当前方法的代码已优化”
无法计算表达式,因为在 ASP.NET 中打印页面时对代码进行了优化