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

143

Ich erhalte den Fehler:

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

Ich habe im itemcommand-Ereignis des Repeaters auf eine neue Seite umgeleitet. Der Fehler tritt an 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 _COMPlusExceptionCodeist - 532459699.

Radhi
quelle

Antworten:

162
Request.Redirect(url,false);

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

PrateekSaluja
quelle
2
Gibt es so etwas wie Request.Redirect (url, false)?
F11
Es gibt keine Weiterleitungseigenschaft der Anfrage
Karan
@karan welche Version Sie auch verwenden Anfrage wird wie diese "Anfrage" sein
PrateekSaluja
125

Machen Sie das zweite Argument von Response false wie unten gezeigt.

Response.Redirect(url,false);
Radhi
quelle
67

Auflösung

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen:

  • Rufen Sie für Response.End die Methode HttpContext.Current.ApplicationInstance.CompleteRequest () anstelle von Response.End auf, 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 false für den Parameter endResponse übergibt , 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 auf Response.Redirect folgt.

  • Für Server.Transfer , verwenden Sie die Server.Execute stattdessen Methode.

Symptome

Wenn Sie die Response.End-, Response.Redirect- oder Server.Transfer-Methode 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 auf das Application_EndRequest-Ereignis in der Ereignispipeline der Anwendung. Die Codezeile, die auf Response.End folgt, wird nicht ausgeführt.

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

Status

Dieses Verhalten ist beabsichtigt.

Eigenschaften

Artikel-ID: 312629 - Letzte Überprüfung: 30. August 2012 - Überarbeitung: 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

Michel Ayres
quelle
14

In einem Fehler, den ich untersucht habe, gab es eine Response.Redirect (), die an einem unerwarteten Speicherort ausgeführt wurde ( lesen Sie: unangemessener Speicherort - innerhalb einer Getter-Methode für Elementeigenschaften ).

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

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

Dies war frustrierend, da es den Anschein hatte, als würde der Redirect-Aufruf ausgeführt, bevor der "Step Through" des Debuggers diesen Speicherort erreicht hatte.

Nick Josevski
quelle
13

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 E-Mail verwenden

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen: Rufen Sie für Response.End anstelle von Response.End die Methode HttpContext.Current.ApplicationInstance.CompleteRequest auf, 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 false für den Parameter endResponse ü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.

Mandeep Janjua
quelle
3

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

Scott
quelle
3

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();
}
Swathi
quelle
5
Eine etwas ausführlichere Erklärung dessen, was dieser Code tut, wäre schön.
Meryovi
3

Auch können Sie verwenden Server.Execute

sambit.albus
quelle
2

Nur umhüllen, dass jemand anderes auf die Probleme gestoßen ist, die ich bei der Verwendung von Response.End () als asynchroner Auslösetaste hatte

<asp:AsyncPostBackTrigger ControlID="btn_login" />

in einem Update-Panel. Ich wechselte zum regulären Post zurück nicht das Beste, aber es hat funktioniert.

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

Da ich nur auf die Seite umleitete, war dies eine praktikable Lösung.

vikingben
quelle
2

Wenn Sie Update Panel und Link Button zum Herunterladen von Excel verwenden, befindet sich innerhalb des Panels ein Postback-Trigger

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

und im Code hinter dem Inside-Click-Ereignis

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
quelle
1

Verwenden Sie dies, funktioniert für mich immer.

Response.Redirect(Request.RawUrl, false);

Hier leitet Response.Redirect (Request.RawUrl) einfach zur URL des aktuellen Kontexts um, während der zweite Parameter "false" entweder endResponse angibt oder nicht.

Chidi-Nwaneto
quelle
1
Willkommen bei Stackoverflow. Bitte erläutern Sie Ihre Antwort, warum es funktioniert und wie es das Problem löst, damit andere es leicht verstehen können.
Octobus
0

Dieses Problem kann auftreten, wenn Sie eine Rasiermesserseite in MVC mit einem Modell haben, das einige Validierungsregeln enthält. Wenn Sie aus einem Formular posten und vergessen, Validierungsfehler in einem Feld anzuzeigen, wird diese Meldung möglicherweise angezeigt. Spekulation: Dies kann der Fall sein, wenn die Methode, an die Sie senden, anders ist und von anderen Quellen verwendet wird oder sich an einem anderen Ort befindet als die Methode, die die ursprüngliche Anforderung bedient.

Da es anders ist, kann es nicht zur ursprünglichen Seite zurückkehren, um die Fehler anzuzeigen oder zu behandeln, da die Ausführung und der Modellstatus nicht identisch sind (so ähnlich).

Es kann etwas schwierig zu entdecken sein, aber es ist leicht, einen Fehler zu machen. Stellen Sie sicher, dass Ihre Empfangsmethode tatsächlich alle möglichen Möglichkeiten zum Posten überprüft.

Selbst wenn Sie beispielsweise eine serverseitige Validierung haben, die es tatsächlich unmöglich macht, eine Zeichenfolge in die Form zu schreiben, die größer als das von Ihrer Validierung zulässige Maximum ist, kann es andere Möglichkeiten und Quellen geben, die an die Empfangsmethode senden.

Johan Herstad
quelle