wake-up-neo.com

Ausdruck kann nicht ausgewertet werden, da der Code optimiert ist oder sich ein systemeigener Frame über dem Aufrufstapel befindet

Ich erhalte den Fehler:

Ausdruck kann nicht ausgewertet werden, da der Code optimiert ist oder sich ein systemeigener Frame über dem Aufrufstapel befindet.

Ich habe im itemcommand-Ereignis des Repeaters auf eine neue Seite umgeleitet. Der Fehler tritt in der Zeile auf:

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

Kann mir bitte jemand helfen? Stimmt da etwas nicht? Das _COMPlusExceptionCode ist -532459699.

142
Radhi

Machen Sie das zweite Argument von Responsefalse wie unten gezeigt.

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

false gibt an, ob die Ausführung der aktuellen Seite beendet werden soll.

159
PrateekSaluja

Auflösung

Wenden Sie eine der folgenden Methoden an, um dieses Problem umzugehen:

  • Rufen Sie für Response.End das HttpContext.Current.ApplicationInstance.CompleteRequest () auf Methode anstelle von Response.End , um die Codeausführung an das Ereignis Application_EndRequest zu umgehen.

  • Verwenden Sie für Response.Redirect eine Überladung, Response.Redirect (String url, bool endResponse) die übergibt false für den Parameter endResponse , um den internen Aufruf von Response.End zu unterdrücken. Beispiel: Response.Redirect ("nextpage.aspx", false); Wenn Sie diese Problemumgehung verwenden, wird der Code ausgeführt, der Response.Redirect folgt.

  • Verwenden Sie für Server.Transfer stattdessen die Methode Server.Execute .

Symptome

Wenn Sie die Methode Response.End, Response.Redirect oder Server.Transfer verwenden, tritt eine ThreadAbortException-Ausnahme auf. Sie können eine try-catch-Anweisung verwenden, um diese Ausnahme abzufangen.

Ursache

Die Response.End-Methode beendet die Seitenausführung und verschiebt die Ausführung zum Application_EndRequest-Ereignis in der Ereignis-Pipeline der Anwendung. Die Codezeile, die auf Response.End folgt, wird nicht ausgeführt.

Dieses Problem tritt bei den Response.Redirect- und den Server.Transfer-Methoden auf, da beide Methoden intern Response.End aufrufen.

Status

Dieses Verhalten ist beabsichtigt.

Eigenschaften

Artikel-ID: 312629 Geändert am: Montag, 30. August 2012 Version: 4.0

Gilt für

  • 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

Schlüsselwörter: kbexcepthandling kbprb KB312629

Quelle: PRB: ThreadAbortException tritt auf, wenn Sie Response.End, Response.Redirect oder Server.Transfer verwenden

66
Michel Ayres

In einem Fehler, den ich untersuchte, gab es eine Response.Redirect () und es wurde an einem nerwarteten Ort ( gelesen: unangemessener Ort - innerhalb einer Getter-Methode für Elementeigenschaften ).

Wenn Sie ein Problem debuggen und die Ausnahme " Ausdruck kann nicht ausgewertet werden ... " erhalten:

  1. Führen Sie eine Suche nach Response.Redirect() durch und geben Sie entweder den zweiten Parameter endResponse = false oder
  2. Deaktivieren Sie vorübergehend den Umleitungsaufruf .

Dies war frustrierend, da es den Anschein hatte, als würde der Umleitungsaufruf ausgeführt, bevor der "Durchstieg" des Debuggers diesen Ort erreicht hatte.

14
Nick Josevski

Bitte überprüfen Sie diesen Link auf den Grund für dieses Problem und die Lösung für den Fehler:

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

Microsoft Support-Artikel:

PRB: ThreadAbortException tritt auf, wenn Sie Response.End, Response.Redirect oder Server.Transfer Print Print Email Email verwenden

Wenden Sie eine der folgenden Methoden an, um dieses Problem zu umgehen: Rufen Sie für Response.End die HttpContext.Current.ApplicationInstance.CompleteRequest-Methode anstelle von Response.End auf, um die Codeausführung an das Application_EndRequest-Ereignis zu umgehen.

Verwenden Sie für Response.Redirect die Überladung Response.Redirect (String url, bool endResponse), die für den Parameter endResponse false übergibt, um den internen Aufruf von Response.End zu unterdrücken.

Zum Beispiel: Response.Redirect ("nextpage.aspx", false);

Wenn Sie diese Problemumgehung verwenden, wird der Code ausgeführt, der auf Response.Redirect folgt. Verwenden Sie für Server.Transfer stattdessen die Server.Execute-Methode.

13
Mandeep Janjua

verwenden Sie diesen Code, um das Problem zu lösen:

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

Ich hatte das gleiche Problem und es war schwierig. Für mich lag es daran, dass ich die Javascript-Bibliothek von Ext.J verwende. Wenn Sie im serverseitigen Code, auf den Sie zugegriffen haben, eine response.redirect-Anweisung ausführen in einem Ajax-Aufruf, treten Probleme auf. Ext.js hat eine Problemumgehung mit der Ext.Redirect-Methode.

3
scott

Sie können auch Server.Execute

3
sambit.albus

Nur weil jemand anderes auf die Probleme gestoßen ist, die ich gemacht habe, habe ich Response.End () als asynchrone Auslöseschaltfläche verwendet

<asp:AsyncPostBackTrigger ControlID="btn_login" />

in einem Update-Panel. Ich habe auf reguläre Post zurückgeschaltet, nicht das Beste, aber es hat funktioniert.

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

Da ich nur auf der Seite umgeleitet habe, war dies eine praktikable Lösung.

2
vikingben

Wenn Sie das Update-Bedienfeld und die Verknüpfungsschaltfläche zum Herunterladen von Excel verwenden, befindet sich Excel innerhalb des Bedienfelds. Fügen Sie dann einen Postback-Trigger hinzu

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

und im Code hinter dem Inside Click Event

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