无法计算表达式,因为代码已优化或本机帧位于调用堆栈的顶部

我得到了一个错误:

无法计算表达式,因为代码已优化或本机帧位于调用堆栈的顶部。

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

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

有人能帮帮我吗? 有什么问题吗? _COMPlusExceptionCode是-532459699

297298 次浏览

如下所示,制作 Response 假的的第二个参数。

Response.Redirect(url,false);

在我调查的一个 bug 中,有一个 Response. Redirect () ,它在 意想不到的地点(Read: 不适当的位置-在成员属性 getter 方法内)中执行。

如果您正在调试一个问题,并且遇到了“ 无法计算表达式。”异常:

  1. 执行对 Response.Redirect()的搜索并使第二个参数 EndResponse = 假的,或者
  2. 暂时禁用 转接电话

这是令人沮丧的,因为它似乎执行 转接电话之前的“步骤通过”调试器已经到达该位置。

我也有同样的问题,而且很棘手。对我来说,这是因为我正在使用 Ext.Js javascript 库。如果您在访问 在一个阿贾克斯电话的服务器端代码中执行 response. redirect,那么就会出现问题。Ext.js 对 Ext.有一个变通方案。重定向法。

Request.Redirect(url,false);

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

请检查这个链接背后的原因,这个问题和错误的解决方案:

Http://support.microsoft.com/kb/312629/en-us/

Microsoft 支持文章:

如果您使用响应。结束,响应。重定向,或服务器。转移打印电子邮件异常发生

若要解决此问题,请使用下列方法之一: 响应。结束,调用 取而代之的是 HttpContext.Current. ApplicationInstance. CompleteRequest 方法 结束以绕过代码执行到 Application _ EndRequest 事件。

重定向,使用重载, Redirect (String url,bool endResponse) 假的 EndResponse 参数,用于抑制对 回应,完毕。

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

如果使用此解决方案,则执行 Response.Redirect 后面的代码 而是执行方法。

你也可以使用 Server.Execute

决心

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

  • 对于 回应,调用 < a href = “ http://msdn.microsoft.com/en-us/library/system.web.HttpContext.ApplicationInstance% 28v = vs. 110% 29.aspx”rel = “ noReferrer”> < strong > HttpContext. Current. ApplicationInstance. CompleteRequest () 方法而不是 回应,完毕来绕过代码执行到 Application _ EndRequest event.

  • 对于 响应。重定向 ,使用一个重载 Redirect (String url,bool endResponse),它为 EndResponse参数传递 假的以抑制对 回应,完毕的内部调用。例如: < strong > < em > < code > Response。再次询问 如果使用这个解决方案,代码 响应后面是。执行重定向。

  • 对于 服务器。传输 ,改为使用 服务器。执行 方法。

症状

如果使用 Response. End、 Response. Redirect 或 Server.Transfer,则为 方法,则会发生 ThreadAbortException 异常 Try-catch 语句捕获此异常。

因为

End 方法结束页面执行并将 应用程序的 事件管道。响应后面的代码行 处决。

此问题发生在 Response.Redirect 和 Server.Transfer 中 因为这两个方法都调用 Response。

报告情况

这种行为是设计好的。

物业

文章 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

来源: < a href = “ http://Support.microsoft.com/kb/312629/en-us”rel = “ noReferrer”> PRB: 如果使用响应,线程流出异常发生。结束、响应、重定向或服务器。传输

使用这个代码解决问题:

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

只是包装别人遇到的问题,我做了我正在使用响应。End ()异步触发器按钮

<asp:AsyncPostBackTrigger ControlID="btn_login" />

在一个更新面板。我切换到常规回来不是最好的,但它工作。

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

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

如果您使用更新面板和链接按钮下载 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();

用这个,对我总是有效。

Response.Redirect(Request.RawUrl, false);

这里,回应。重定向(请求。RawUrl)只是重定向到当前上下文的 url,而第二个参数“ false”指示 endResponse 与否。

当您在 mvc 中有一个剃须刀页面,其中的模型具有一些验证规则时,这个问题可能就是结果。当您从表单发布消息时,忘记在某些字段上显示验证错误,那么可能会出现此消息。推测: 这可能是如果您发布的方法是不同的,并由其他来源使用或驻留在不同的地方,而不是服务于原始请求的方法。

因此,由于它的不同,它不能返回到原始页面来显示或处理错误,因为执行和模型状态不相同(类似的情况)。

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

例如,即使服务器端验证实际上不可能在表单中写入大于验证允许的最大值的字符串,也可能有其他方法和来源发布到接收方法。