无法评估expression式,因为代码已经过优化,或者本地框架位于调用堆栈之上

我收到错误:

无法评估expression式,因为代码已经过优化,或者本地框架位于调用堆栈之上。

我已经redirect到中继器的itemcommand事件中的新页面。 该行发生错误:

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

任何人都可以帮我吗? 有什么不对吗? _COMPlusExceptionCode是 – 532459699

 Request.Redirect(url,false); 

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

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

 Response.Redirect(url,false); 

parsing度

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

  • 对于Response.End ,请调用HttpContext.Current.ApplicationInstance.CompleteRequest()方法而不是Response.End以绕过执行到Application_EndRequest事件的代码。

  • 对于Response.Redirect ,使用重载, Response.Redirect(String url,bool endResponse)endResponseparameter passingfalse以禁止对Response.End的内部调用。 例如: Response.Redirect ("nextpage.aspx", false); 如果您使用此解决方法,则执行Response.Redirect后面的代码。

  • 对于Server.Transfer ,请改用Server.Execute方法。

症状

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

原因

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

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

状态

此行为是devise使然。

属性

文章编号: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:如果您使用Response.End,Response.Redirect或Server.Transfer发生ThreadAbortException

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

如果您正在debugging问题并体验“ 无法评估expression式… ”exception:

  1. 执行Response.Redirect()的search,并使第二个参数endResponse = false ,或
  2. 暂时禁用redirect呼叫

这是令人沮丧的,因为在debugging器的“step through”到达那个位置之前,似乎要执行redirect呼叫

请检查这个链接的原因背后的原因和解决scheme的错误:

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)为endResponseparameter passingfalse以禁止对Response.End的内部调用。

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

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

我也有同样的问题,这是棘手的。 对我来说,这是因为我使用Ext.Js JavaScript库。 如果您在通过Ajax调用访问的服务器端代码中执行response.redirect,则会出现问题。 Ext.js与他们的Ext.Redirect方法有一个解决方法。

使用这个代码解决问题:

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

你也可以使用Server.Execute

只是包装别人遇到了我使用Response.End()asynchronous触发button的问题

 <asp:AsyncPostBackTrigger ControlID="btn_login" /> 

在更新面板中。 我切换到正常回发不是最好的,但它的工作。

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

由于我只是在页面上redirect,所以这是一个可行的解决scheme。

如果你正在使用更新面板和链接button来下载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();