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


143

Recibo 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 _COMPlusExceptionCodees - 532459699.

Respuestas:


162
Request.Redirect(url,false);

false indica si la ejecución de la página actual debe finalizar.


2
¿Hay algo como Request.Redirect (url, false)?
F11

no hay propiedad de redireccionamiento de solicitud
karan

@karan, qué versión está utilizando, la solicitud será así "Solicitud"
PrateekSaluja

125

Haga un segundo argumento Response falso como se muestra a continuación.

Response.Redirect(url,false);

67

Resolución

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

Síntomas

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

Porque

El método Response.End finaliza la ejecución de la página y la desplaza 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

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


14

En un error que estaba investigando, había un Response.Redirect () y se estaba ejecutando en una ubicación inesperada ( léase: ubicación inapropiada - 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. Realizar una búsqueda de Response.Redirect() y realice el segundo parámetro endResponse = false , o
  2. Desactiva temporalmente la llamada de redireccionamiento .

Esto fue frustrante, ya que parecería ejecutar la llamada de redireccionamiento antes de que el "paso" en el depurador haya llegado a esa ubicación.


13

Consulte este enlace para conocer el motivo 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 Imprimir Imprimir Correo electrónico Correo electrónico

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 pasa falso para el parámetro endResponse para suprimir la llamada interna a Response.End.

Por ejemplo: Response.Redirect ("nextpage.aspx", falso);

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


3

También tuve este mismo problema, y ​​fue complicado. Para mí, fue porque estoy usando la biblioteca JavaScript Ext.Js. Si está haciendo un response.redirect en el código del lado del servidor al que accedió en una llamada Ajax , hay problemas. Ext.js tiene una solución alternativa con su método Ext.Redirect.


3

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

55
Un poco más de explicación de lo que hace este código sería bueno.
Meryovi


2

Simplemente encubrir a alguien más se topó con los problemas que hice cuando estaba usando Response.End () un botón de disparo asíncrono

<asp:AsyncPostBackTrigger ControlID="btn_login" />

en un panel de actualización. Cambié a la publicación regular de nuevo, no es la mejor, pero funcionó.

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

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


2

Si está utilizando el Panel de actualización y el botón de enlace para descargar Excel está dentro del panel, entonces agregue el disparador de devolución de datos

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

y en el código detrás del evento de clic 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();

1

Usa esto, siempre funciona para mí.

Response.Redirect(Request.RawUrl, false);

Aquí, Response.Redirect (Request.RawUrl) simplemente redirige a la url del contexto actual, mientras que el segundo parámetro "falso" indica endResponse o no.


1
Bienvenido a Stackoverflow. Explique su respuesta, ¿por qué funciona? ¿Cómo resuelve el problema para que otros puedan entenderlo fácilmente?
octobus

0

Este problema puede ser el resultado cuando tiene una página de afeitar en mvc con un modelo que tiene algunas reglas de validación. Cuando publica desde un formulario y olvida mostrar errores de validación en algún campo, entonces puede aparecer este mensaje. Especulación: esto podría ser si el método en el que está publicando es diferente y es utilizado por otras fuentes o reside en un lugar diferente al método que atiende la solicitud original.

Entonces, debido a que es diferente, no puede volver a la página original para mostrar o manejar los errores porque la ejecución y el estado del modelo no son los mismos (algo así).

Puede ser un poco difícil de descubrir, pero es un error fácil de hacer. Asegúrese de que su método de recepción realmente valide todas las formas posibles de publicar en él.

por ejemplo, incluso si tiene una validación en el servidor que realmente hace que sea imposible escribir en el formulario una cadena que sea más grande que el máximo permitido por su validación, podría haber otras formas y fuentes que publiquen en el método de recepción.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.