由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

8/10/2015来源:ASP.NET技巧人气:2645

由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

前言

上段时间做项目时,遇到如题之类问题,如今过去有一段时间了,具体出现的情形忘了,当时虽然找到了解决方法,但是依旧没有弄明白出现此种情况是何种原因,后来在微软的帮助支持中心找到了答案,特此记录,以防遗忘。

症状

使用Response.End(), Response.Redirect()Server.Transfer()方法,将引发ThreadAbortException 异常,可以使用try-catch语句来捕捉此异常。项目中Response.Redirect()用户登录成功跳转某页面,失败跳转某页面(中间有双开,登录超时等等验证)。运行报错:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

原因

Response.End():结束页执行和将执行切换到应用程序的事件管道中的application_EndRequest事件,Response.End()之后的代码行不会被执行;Response.Redirect()Server.Transfer()这两种方法都会内部调用Response.End();

解决方案

  1. 调用HttpContext.Current.ApplicationInstance.CompleteRequest方法,能够绕过Application_EndRequest事件的代码执行。
  2. 对于Response.Redirect(),使用重载,取消内部调用Response.EndendResponse参数(url 字符串、 布尔值 endResponse) 。例如: Response.Redirect ("xxxpage.aspx", false);
  3. 对于Server.Transfer(),可以改用Server.Execute()方法。

原文参考地址:https://support.microsoft.com/zh-cn/kb/312629