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.

Antworten:


162
Request.Redirect(url,false);

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


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);

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


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.


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.


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.


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

5
Eine etwas ausführlichere Erklärung dessen, was dieser Code tut, wäre schön.
Meryovi


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.


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();

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.