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
.
Définissez le second argument de Response
false comme indiqué ci-dessous.
Response.Redirect(url,false);
Request.Redirect(url,false);
false
indique si l'exécution de la page en cours doit être terminée.
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.
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.
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.
Ce comportement est voulu.
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
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 ... ":
Response.Redirect()
et définissez le deuxième paramètre endResponse = false, ouC'é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.
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.
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();
}
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.
Aussi, vous pouvez utiliser Server.Execute
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.
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();