asp.net - método - no se puede evaluar la expresion porque el codigo del metodo actual esta optimizado
No se puede evaluar la expresión porque el código está optimizado o un marco nativo está en la parte superior de la pila de llamadas (10)
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 pila 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
.
Resolución
Para evitar este problema, use uno de los siguientes métodos:
Para Response.End , llame al método HttpContext.Current.ApplicationInstance.CompleteRequest() 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 lugar.
Síntomas
Si usa el método Response.End, Response.Redirect o Server.Transfer, se produce una excepción ThreadAbortException. Puede usar una declaración 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
Consulte este enlace por el motivo detrás de este problema y la solución del 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.
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 ... ":
- Realice una búsqueda de
Response.Redirect()
y haga que el segundo parámetro endResponse = false , o - 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.
Haga que el segundo argumento de Response
falso, como se muestra a continuación.
Response.Redirect(url,false);
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
<asp:PostBackTrigger ControlID="lnkTemplate" />
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();
Simplemente encerrar a alguien más se encontró con los problemas que hice. Estaba usando Response.End () un botón desencadenante asíncrono.
<asp:AsyncPostBackTrigger ControlID="btn_login" />
en un panel de actualización. Cambié a la publicación normal no fue la mejor pero funcionó.
<asp:PostBackTrigger ControlID="btn_login" />.
Como solo estaba redireccionando en la página, esta era una solución viable.
También puedes usar Server.Execute
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();
}
Request.Redirect(url,false);
false
indica si la ejecución de la página actual debería finalizar.