No se puede evaluar la expresión porque el código está optimizado o un marco nativo está en la parte superior de la stack de llamadas

Estoy obteniendo el error:

No se puede evaluar la expresión porque el código está optimizado o un marco nativo está en la parte superior de la stack de llamadas.

He redirigido a una nueva página en el evento itemcommand del repetidor. El error ocurre en la línea:

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

¿Alguien puede ayudarme? ¿Hay algo mal allí? El _COMPlusExceptionCode es – 532459699 .

 Request.Redirect(url,false); 

false indica si la ejecución de la página actual debería finalizar.

Haga que el segundo argumento de Response falso, como se muestra a continuación.

 Response.Redirect(url,false); 

Resolución

Para evitar este problema, use uno de los siguientes métodos:

  • Para Response.End , llame al método HttpContext.Current.ApplicationInstance.CompleteRequest () en lugar de Response.End para omitir la ejecución del código en el evento Application_EndRequest .

  • Para Response.Redirect , use una sobrecarga, Response.Redirect (String url, bool endResponse) que pase falso para el parámetro endResponse para suprimir la llamada interna a Response.End . Por ejemplo: Response.Redirect ("nextpage.aspx", false); Si usa esta solución, se ejecuta el código que sigue a Response.Redirect.

  • Para Server.Transfer , use el método Server.Execute en su lugar.

Síntomas

Si usa el método Response.End, Response.Redirect o Server.Transfer, se produce una excepción ThreadAbortException. Puede usar una statement try-catch para captar esta excepción.

Porque

El método Response.End finaliza la ejecución de la página y cambia la ejecución al evento Application_EndRequest en la canalización de eventos de la aplicación. La línea de código que sigue a Response.End no se ejecuta.

Este problema se produce en los métodos Response.Redirect y Server.Transfer porque ambos métodos llaman a Response.End internamente.

Estado

Este comportamiento es por diseño.

Propiedades

ID del artículo: 312629 – Última revisión: 30 de agosto de 2012 – Revisión: 4.0

Se aplica a

  • 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

Palabras clave: kbexcepthandling kbprb KB312629

Origen: PRB: ThreadAbortException se produce si utiliza Response.End, Response.Redirect o Server.Transfer

En un error que estaba investigando, había un Response.Redirect () y se estaba ejecutando en una ubicación inesperada ( léase: ubicación inadecuada, dentro de un método de obtención de propiedades miembro ).

Si está depurando un problema y experimenta la excepción ” No se puede evaluar la expresión … “:

  1. Realice una búsqueda de Response.Redirect() y haga que el segundo parámetro endResponse = false , o
  2. Desactive temporalmente la llamada de redirección .

Esto fue frustrante ya que parecía ejecutar la llamada Redirigir antes de que el “paso” en el depurador hubiera alcanzado esa ubicación.

Consulte este enlace por el motivo detrás de este problema y la solución para el error:

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

Artículo de soporte de Microsoft:

PRB: ThreadAbortException se produce si utiliza Response.End, Response.Redirect o Server.Transfer Print Print Email Email

Para evitar este problema, utilice uno de los métodos siguientes: Para Response.End, invoque el método HttpContext.Current.ApplicationInstance.CompleteRequest en lugar de Response.End para omitir la ejecución del código en el evento Application_EndRequest.

Para Response.Redirect, use una sobrecarga, Response.Redirect (String url, bool endResponse) que pase falso para el parámetro endResponse para suprimir la llamada interna a Response.End.

Por ejemplo: Response.Redirect (“nextpage.aspx”, false);

Si usa esta solución, se ejecuta el código que sigue a Response.Redirect. Para Server.Transfer, use el método Server.Execute en su lugar.

Tuve el mismo problema también, y fue complicado. Para mí, fue porque estoy usando la biblioteca Javascript de Ext.Js. Si está haciendo una respuesta. Directo en el código del lado del servidor al que accedió en una llamada Ajax , hay problemas. Ext.js tiene una solución con su método Ext.Redirect.

usa este código para resolver el problema:

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

También puedes usar Server.Execute

Simplemente encerrar a alguien más se encontró con los problemas que hice. Estaba usando Response.End () un botón desencadenante asíncrono.

  

en un panel de actualización. Cambié a la publicación normal no fue la mejor pero funcionó.

 . 

Como solo estaba redireccionando en la página, esta era una solución viable.

Si está utilizando el panel de actualización y el botón de enlace para descargar Excel está dentro del panel que agregar el desencadenador de devolución de datos

  

y en el código detrás del evento click interno

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