Impossible d'évaluer l'expression car le code est optimisé ou un cadre natif se trouve au-dessus de la pile d'appels

143

J'obtiens l'erreur:

Impossible d'évaluer l'expression car le code est optimisé ou un cadre natif se trouve au-dessus de la pile d'appels.

J'ai redirigé vers une nouvelle page dans l'événement itemcommand du répéteur. 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? Le _COMPlusExceptionCodeest - 532459699.

Radhi
la source

Réponses:

162
Request.Redirect(url,false);

false indique si l'exécution de la page en cours doit se terminer.

PrateekSaluja
la source
2
Existe-t-il quelque chose comme Request.Redirect (url, false)?
F11
il n'y a pas de propriété de redirection de la demande
karan
@karan quelle version vous utilisez également la demande sera comme ça "Demande"
PrateekSaluja
125

Faites le deuxième argument de Response false comme indiqué ci-dessous.

Response.Redirect(url,false);
Radhi
la source
67

Résolution

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

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 met fin à 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 par la conception.

Propriétés

ID article: 312629 - Dernière révision: 30 août 2012 - Révision: 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

Michel Ayres
la source
14

Dans un bogue que j'étudiais, il y avait un Response.Redirect () et il s'exécutait dans un emplacement inattendu ( lire: emplacement inapproprié - dans une méthode getter de propriété de membre ).

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

  1. Effectuer une recherche Response.Redirect()et soit faire le deuxième paramètre définissez endResponse = false , ou
  2. Désactivez temporairement le appel de redirection .

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

Nick Josevski
la source
13

Veuillez consulter ce lien pour connaître la raison de ce problème et la solution de l'erreur:

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

Article de support Microsoft:

PRB: ThreadAbortException se produit si vous utilisez Response.End, Response.Redirect ou Server.Transfer Imprimer Imprimer 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 contourner l'exécution de code à l'événement Application_EndRequest.

Pour Response.Redirect, utilisez une surcharge, Response.Redirect (String url, bool endResponse) qui passe false pour le paramètre endResponse afin 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 plutôt la méthode Server.Execute.

Mandeep Janjua
la source
3

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

Scott
la source
3

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();
}
swathi
la source
5
Un peu plus d'explications sur ce que fait ce code serait bien.
Meryovi
3

Vous pouvez également utiliser Server.Execute

sambit.albus
la source
2

Enveloppez simplement quelqu'un d'autre a rencontré les problèmes que j'ai rencontrés J'utilisais Response.End () un bouton de déclenchement asynchrone

<asp:AsyncPostBackTrigger ControlID="btn_login" />

dans un panneau de mise à jour. Je suis passé à la publication régulière, ce n'est 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.

vikingben
la source
2

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 de publication.

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

et dans le code derrière l'événement de clic interne

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();
Mudassir Hasan
la source
1

Utilisez ceci, fonctionne pour moi toujours.

Response.Redirect(Request.RawUrl, false);

Ici, Response.Redirect (Request.RawUrl) redirige simplement vers l'url du contexte actuel, tandis que le deuxième paramètre "false" indique soit endResponse ou non.

Chidi-Nwaneto
la source
1
Bienvenue dans Stackoverflow. Veuillez expliquer votre réponse, pourquoi cela fonctionne-t-il comment résout-il le problème, afin que les autres puissent comprendre facilement.
2019
0

Ce problème peut être un résultat lorsque vous avez une page rasoir dans mvc avec un modèle qui a des règles de validation. Lorsque vous publiez à partir d'un formulaire et que vous oubliez d'afficher des erreurs de validation dans certains champs, ce message peut apparaître. Spéculation: cela pourrait se produire si la méthode sur laquelle vous publiez est différente et utilisée par d'autres sources ou réside dans un endroit différent de la méthode servant la demande d'origine.

Donc, parce que c'est différent, il ne peut pas revenir à la page d'origine pour afficher ou gérer les erreurs car l'exécution et l'état du modèle ne sont pas les mêmes (quelque chose comme ça).

Cela peut être un peu difficile à découvrir, mais une erreur facile à faire. Assurez-vous que votre méthode de réception valide réellement toutes les manières possibles d'y publier.

par exemple, même si vous avez une validation côté serveur qui rend en fait impossible d'écrire sous la forme d'une chaîne plus grande que le maximum autorisé par votre validation, il pourrait y avoir d'autres moyens et sources qui publient dans la méthode de réception.

Johan Herstad
la source