Nie można ocenić wyrażenia, ponieważ kod jest zoptymalizowany lub natywna ramka znajduje się na szczycie stosu wywołań


143

Otrzymuję błąd:

Nie można ocenić wyrażenia, ponieważ kod jest zoptymalizowany lub natywna ramka znajduje się na szczycie stosu wywołań.

Przekierowałem do nowej strony w zdarzeniu itemcommand repeatera. Błąd pojawia się na linii:

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

Czy ktoś może mi pomóc? Czy coś jest nie tak? _COMPlusExceptionCodeJest - 532459699.

Odpowiedzi:


162
Request.Redirect(url,false);

false wskazuje, czy wykonanie bieżącej strony powinno się zakończyć.


2
Czy istnieje coś takiego jak Request.Redirect (url, false)?
F11

nie ma właściwości przekierowania żądania
karan

@karan, której wersji używasz i żądanie będzie takie: „Request”
PrateekSaluja

125

Ustaw drugi argument jako Response fałsz, jak pokazano poniżej.

Response.Redirect(url,false);

67

Rozkład

Aby obejść ten problem, użyj jednej z następujących metod:

  • W przypadku Response.End wywołaj metodę HttpContext.Current.ApplicationInstance.CompleteRequest () zamiast Response.End, aby ominąć wykonanie kodu do zdarzenia Application_EndRequest .

  • W przypadku Response.Redirect użyj przeciążenia Response.Redirect (String url, bool endResponse), które przekazuje wartość false dla parametru endResponse , aby pominąć wewnętrzne wywołanie Response.End . Na przykład: Response.Redirect ("nextpage.aspx", false);jeśli zastosujesz to obejście, zostanie wykonany kod następujący po Response.Redirect.

  • W przypadku Server.Transfer użyj zamiast tego metody Server.Execute .

Objawy

W przypadku użycia metody Response.End, Response.Redirect lub Server.Transfer występuje wyjątek ThreadAbortException. Aby złapać ten wyjątek, można użyć instrukcji try-catch.

Przyczyna

Metoda Response.End kończy wykonywanie strony i przenosi wykonanie do zdarzenia Application_EndRequest w potoku zdarzeń aplikacji. Wiersz kodu następujący po Response.End nie jest wykonywany.

Ten problem występuje w metodach Response.Redirect i Server.Transfer, ponieważ obie metody wywołują wewnętrznie Response.End.

Status

To zachowanie jest zgodne z projektem.

Nieruchomości

Numer artykułu: 312629 - Ostatnia weryfikacja: 30 sierpnia 2012 r. - Weryfikacja: 4.0

Dotyczy

  • 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

Słowa kluczowe: kbexcepthandling kbprb KB312629

Źródło: PRB: wyjątek ThreadAbortException występuje, jeśli używasz Response.End, Response.Redirect lub Server.Transfer


14

W błędzie, który badałem, był Response.Redirect () i był on wykonywany w nieoczekiwanej lokalizacji ( czytaj: niewłaściwa lokalizacja - wewnątrz metody pobierającej właściwości elementu członkowskiego ).

Jeśli debugujesz problem i pojawia się wyjątek „ Nie można ocenić wyrażenia ... ”:

  1. Wyszukaj Response.Redirect()i ustaw drugi parametr endResponse = false lub
  2. Tymczasowo wyłącz przekierowanie .

Było to frustrujące, ponieważ wydawało się, że wywołanie przekierowania zostało wykonane, zanim funkcja „przechodzenia przez” debugera dotarła do tej lokalizacji.


13

Sprawdź ten link, aby znaleźć przyczynę tego problemu i rozwiązanie błędu:

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

Artykuł pomocy Microsoft:

PRB: Wyjątek ThreadAbortException występuje, jeśli używasz Response.End, Response.Redirect lub Server.Transfer Drukuj Drukuj Email Email

Aby obejść ten problem, użyj jednej z następujących metod: W przypadku Response.End wywołaj metodę HttpContext.Current.ApplicationInstance.CompleteRequest zamiast Response.End, aby ominąć wykonanie kodu do zdarzenia Application_EndRequest.

W przypadku Response.Redirect użyj przeciążenia Response.Redirect (String url, bool endResponse), które przekazuje wartość false dla parametru endResponse, aby pominąć wewnętrzne wywołanie Response.End.

Na przykład: Response.Redirect ("nextpage.aspx", false);

W przypadku zastosowania tego obejścia wykonywany jest kod następujący po Response.Redirect. W przypadku Server.Transfer użyj zamiast tego metody Server.Execute.


3

Ja też miałem ten sam problem i to było trudne. Dla mnie to dlatego, że używam biblioteki javascript Ext.Js. Jeśli wykonujesz odpowiedź.redirect w kodzie po stronie serwera, do którego uzyskano dostęp w wywołaniu Ajax , występują problemy. Ext.js ma obejście z ich metodą Ext.Redirect.


3

użyj tego kodu rozwiąż problem:

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
Nieco więcej wyjaśnienia tego, co robi ten kod, byłoby fajne.
Meryovi


2

Wystarczy, że ktoś inny napotkał problemy, które zrobiłem. Używałem Response.End () przycisku wyzwalacza asynchronicznego

<asp:AsyncPostBackTrigger ControlID="btn_login" />

w panelu aktualizacji. Przerzuciłem się na zwykły post, który nie był najlepszy, ale zadziałał.

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

Ponieważ przekierowywałem tylko na stronie, było to realne rozwiązanie.


2

Jeśli używasz panelu aktualizacji i przycisku linku do pobrania programu Excel, znajduje się w panelu, a następnie dodaj wyzwalacz postback

<asp:PostBackTrigger ControlID="lnkTemplate" /> 

oraz w kodzie zdarzenia wewnątrz kliknięcia

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

Użyj tego, działa na mnie zawsze.

Response.Redirect(Request.RawUrl, false);

Tutaj Response.Redirect (Request.RawUrl) po prostu przekierowuje do adresu URL bieżącego kontekstu, podczas gdy drugi parametr „false” wskazuje na endResponse lub nie.


1
Witamy w Stackoverflow. Proszę wyjaśnij swoją odpowiedź, dlaczego działa, jak rozwiązuje problem, aby inni mogli łatwo zrozumieć.
octobus

0

Ten problem może wystąpić, gdy w mvc masz stronę brzytwy z modelem, który ma pewne reguły sprawdzania poprawności. Kiedy wysyłasz post z formularza i zapomnisz wyświetlić błędy walidacji w jakimś polu, może pojawić się ten komunikat. Spekulacje: może to mieć miejsce, jeśli metoda, do której wysyłasz, jest inna i używana przez inne źródła lub znajduje się w innym miejscu niż metoda obsługująca pierwotne żądanie.

Więc ponieważ jest inny, nie może powrócić do oryginalnej strony, aby wyświetlić lub obsłużyć błędy, ponieważ stan wykonania i modelu nie jest taki sam (coś takiego).

Może to być nieco trudne do wykrycia, ale łatwo popełnić błąd. Upewnij się, że Twoja metoda odbioru faktycznie weryfikuje wszystkie możliwe sposoby wysyłania do niej wiadomości.

na przykład, nawet jeśli masz walidację po stronie serwera, która faktycznie uniemożliwia napisanie w formie łańcucha, który jest większy niż maksymalny dozwolony przez twoją walidację, mogą istnieć inne sposoby i źródła, które wysyłają do metody odbioru.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.