web-dev-qa-db-fra.com

Impossible d'évaluer une expression car le code est optimisé ou un cadre natif se trouve en haut de la pile d'appels

Je reçois l'erreur:

Impossible d’évaluer l’expression car le code est optimisé ou une image native se trouve au-dessus de la pile d’appels.

J'ai redirigé vers une nouvelle page dans l'événement itemcommand de repeater. L'erreur se produit à la ligne:

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

Quelqu'un peut-il m'aider s'il vous plaît? Quelque chose ne va pas là-bas? Le _COMPlusExceptionCode est -532459699.

142
Radhi

Définissez le second argument de Responsefalse comme indiqué ci-dessous.

Response.Redirect(url,false);
122
Radhi
Request.Redirect(url,false);

false indique si l'exécution de la page en cours doit être terminée.

159
PrateekSaluja

Résolution

Pour contourner ce problème, appliquez l'une des méthodes suivantes:

  • Pour Response.End , appelez le HttpContext.Current.ApplicationInstance .CompleteRequest () méthode à la place de Response.End pour ignorer l'exécution du code jusqu'à Application_EndRequest événement.

  • Pour Response.Redirect , utilisez une surcharge, Response.Redirect (String url, bool endResponse) qui passe false pour la endResponse paramètre permettant de supprimer l'appel interne à Response.End . Par exemple: Response.Redirect ("nextpage.aspx", false); Si vous utilisez cette solution de contournement, le code qui suit Response.Redirect est exécuté.

  • Pour Server.Transfer , utilisez le Server.Execute méthode à la place.

Symptômes

Si vous utilisez la méthode Response.End, Response.Redirect ou Server.Transfer, une exception ThreadAbortException se produit. Vous pouvez utiliser une instruction try-catch pour intercepter cette exception.

Cause

La méthode Response.End termine l'exécution de la page et décale l'exécution vers l'événement Application_EndRequest dans le pipeline d'événements de l'application. La ligne de code qui suit Response.End n'est pas exécutée.

Ce problème se produit dans les méthodes Response.Redirect et Server.Transfer, car les deux méthodes appellent Response.End en interne.

Statut

Ce comportement est voulu.

Propriétés

Numéro d'article: 312629 - Dernière mise à jour: 30 août 2012 - Version: 4.0

S'applique à

  • 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

Mots-clés: kbexcepthandling kbprb KB312629

Source: PRB: ThreadAbortException se produit si vous utilisez Response.End, Response.Redirect ou Server.Transfer

66
Michel Ayres

Dans un bogue que je cherchais, il y avait un Response.Redirect () qui s'exécutait dans un emplacement inattend ( lu: emplacement inapproprié - dans une méthode getter de propriété de membre ).

Si vous déboguez un problème et rencontrez l'exception " Impossible d'évaluer l'expression ... ":

  1. Effectuez une recherche pour Response.Redirect() et définissez le deuxième paramètre endResponse = false, ou
  2. Désactiver temporairement l'appel de redirection .

C'était frustrant, car il semblerait que l'exécution de l'appel de redirection avant que le "pas à travers" du débogueur ait atteint cet emplacement.

14
Nick Josevski

Veuillez vérifier ce lien pour la raison derrière ce problème et la solution pour l'erreur:

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

Article de support Microsoft:

Problème: exception ThreadAbortException se produit si vous utilisez Response.End, Response.Redirect ou Server.Transfer Imprimer Imprimer E-mail E-mail

Pour contourner ce problème, appliquez l'une des méthodes suivantes: Pour Response.End, appelez la méthode HttpContext.Current.ApplicationInstance.CompleteRequest au lieu de Response.End pour ignorer l'exécution de code dans l'événement Application_EndRequest.

Pour Response.Redirect, utilisez une surcharge, Response.Redirect (String url, bool endResponse) qui transmet la valeur false au paramètre endResponse pour supprimer l'appel interne à Response.End.

Par exemple: Response.Redirect ("nextpage.aspx", false);

Si vous utilisez cette solution de contournement, le code qui suit Response.Redirect est exécuté. Pour Server.Transfer, utilisez plutôt la méthode Server.Execute.

13
Mandeep Janjua

utilisez ce code pour résoudre le problème:

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

J'ai eu ce même problème aussi, et c'était délicat. Pour moi, c'est parce que j'utilise la bibliothèque javascript de Ext.Js. Si vous effectuez un response.redirect dans le code côté serveur auquel vous avez accédé à dans un appel Ajax, il y a des problèmes. Ext.js a une solution de contournement avec leur méthode Ext.Redirect.

3
scott

Aussi, vous pouvez utiliser Server.Execute

3
sambit.albus

Juste envelopper quelqu'un d'autre a rencontré les problèmes que j'ai eu J'utilisais Response.End () un bouton déclencheur async

<asp:AsyncPostBackTrigger ControlID="btn_login" />

dans un panneau de mise à jour. Je suis passé au courrier régulier, pas le meilleur mais cela a fonctionné.

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

Comme je ne faisais que rediriger sur la page, c'était une solution viable.

2
vikingben

Si vous utilisez le panneau de mise à jour et que le bouton de lien pour télécharger Excel se trouve dans le panneau, ajoutez un déclencheur postback.

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

et dans le code derrière l'événement click à l'intérieur

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();
2
Mudassir Hasan