2011-02-11 11 views
6

Muszę obsługiwać 404 wyjątków inaczej niż wszystkie inne typy. Jaki jest najlepszy sposób zidentyfikowania tych 404 wyjątków (odróżnić je od innych wyjątków)?W programie ASP.NET: jak identyfikować/przetwarzać wyjątki 404?

Problem polega na tym, że nie ma specjalnej klasy wyjątków dla błędów 404, otrzymuję regularny Wyjątek System.Web.HttpException z Message = "Plik nie istnieje."

Czy powinienem użyć do tego celu komunikatu wyjątku, czy jest lepszy sposób?

Dziękuję.

+0

Uchwyt gdzie? W obsłudze błędów aplikacji Global.asax? W kodzie wywołującym inną aplikację ASP.NET (np. Klienta WWW)? –

+0

Uchwyt w pliku global.asax po stronie serwera. –

Odpowiedz

18

Można spróbować rzucić wyjątek jako HttpException, a następnie użyć metody GetHttpCode, by sprawdzić, czy jest to 404 czy nie.

Na przykład:

Exception ex = Server.GetLastError(); 

HttpException httpEx = ex as HttpException; 

if (httpEx != null && httpEx.GetHttpCode() == 404) 
{ 
    //do what you want for 404 errors 
} 
+0

Doskonały! Dziękuję Ci! To jest to! –

3

Proponuję skonfigurować aplikację, aby przekierowywała błędy 404 do konkretnej strony, na przykład ~/FourOhFour.aspx. Na tej stronie można sprawdzić parametr zapytania o numerze aspxerrorpath, który będzie raportował stronę, którą użytkownik próbował odwiedzić. Stąd możesz zrobić wiele interesujących rzeczy, od logowania 404, wysyłania wiadomości e-mailem, do próby ustalenia prawidłowego adresu URL i automatycznego przekierowania użytkownika do tego.

Aby skonfigurować aplikację internetową, aby przekierować użytkownika do strony niestandardowej w obliczu 404 dodaj następujący znaczników do web.config w sekcji <system.web>:

<customErrors mode="On" defaultRedirect="~/GeneralError.aspx"> 
    <error statusCode="404" redirect="~/FourOhFour.aspx" /> 
</customErrors> 

Aby uzyskać więcej informacji, patrz:

+0

Dziękuję. Robię to już wszystko, ale to nie jest problem. Mój problem polega na tym, że wyjątek jest nadal zgłaszany w global.asax, nawet jeśli przekierowanie działało i muszę go tam obsłużyć. Jak mogę stwierdzić, że wyjątek to HTTP 404, a nie drugi? –

1

W pliku web.config można specifiy oddzielny plik dla każdego kodu błędu.

<customErrors mode="Off" defaultRedirect="GenericErrorPage.htm"> 
     <error statusCode="404" redirect="FileNotFound.aspx" /> 
    </customErrors> 
+0

Robię to już, ale wyjątek, który opisałem, nadal jest wyświetlany i nadal muszę go poprawnie obsłużyć w pliku global.asax. –

2

Możesz złapać wyjątek. Próbujesz to złapać w aplikacji klienckiej, prawda?

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(someURL); 
try 
{ 
    HttpWebResponse resp = req.GetResponse(); 
} 
catch(WebException webEx) 
{ 
    if(webEx.Response != null) 
    { 
     HttpWebResponse response = webEx.Response as HttpWebResponse; 
     switch(response.StatusCode) 
     { 
     case HttpStatusCode.NotFound: 
      // do something 
      break; 
+0

Nie, to jest czysta strona serwera: global.asax. Nie mam problemu z wyłapaniem wyjątku, moim problemem jest zidentyfikowanie go jako HTTP 404. –