2012-08-30 13 views
5

Jestem nowy w aspx formularzy internetowych.Złap tylko określony wyjątek HttpException

Chcę złapać określony wyjątek w mojej aplikacji internetowej - Validation of viewstate MAC failed.
Próbowałem to (w Global.asax.cs):

protected void Application_Error(object sender, EventArgs e) 
{ 
    HttpException lastErrWrapper = Server.GetLastError() as HttpException; 

    if ((uint)lastErrWrapper.ErrorCode == 0x80004005) 
    { 
     // do something 
    }   
} 

Problemem jest to, że łapie wszystkie nieobsłużonych HttpExceptions.

Jaki jest najlepszy sposób, aby to osiągnąć?


edit:

Podczas sprawdzania kwestia ta dodatkowo okazało się, że wewnętrzna Wyjątkiem jest ViewStateException, ale nie wydaje się mieć specyficzny "ERRORCODE" atrybutu

Thanks

+0

Co chcesz zrobić z innymi nieobsłużonych wyjątków? – MNGwinn

+2

Wierzę, że ten rzut może spowodować sam wyjątek. Powinieneś przetestować jak 'if (Server.GetLastError() jest HttpException) {...}' –

+0

@MNGwinn - To naprawdę nie ma znaczenia, chcę zrobić "inną rzecz" wtedy gdy jest to 'Validation of viewstate MAC failed' – Bassal

Odpowiedz

5

Powinno to zrobić:

if ((lastErrWrapper != null) && (lastErrWrapper.InnerException != null) 
    && (lastErrWrapper.InnerException is ViewStateException) 
{ 
} 

HttpExce ption ma na celu umożliwienie odczytywania wszystkich rzeczy związanych z HTTP/web przez jednego handler'a, więc musisz zagłębić się w oryginalny wyjątek. ViewStateException może złapać kilka innych błędów związanych z View State, ale to chyba OK.

+0

Dzięki, to też odkryłem (zobacz moją edycję). Czy nie ma możliwości sprawdzenia, który błąd wyświetlania stanu został zgłoszony? – Bassal

+0

Najlepszym rozwiązaniem jest prawdopodobnie sprawdzenie wszystkich właściwości wyjątku viewstateexception podczas debugowania, aby sprawdzić, czy którekolwiek z nich je odróżnia. W przeciwnym razie można po prostu sprawdzić komunikat wyjątku dla określonego "sprawdzania poprawności makra z podglądem nie powiodło się". – ryanulit

+0

Właściwość ErrorCode w HttpException nie jest dziedziczona z wyjątku, a ViewStateException nie pochodzi z wyjątku HttpException, więc nie spodziewałbym się go zobaczyć. Dokumenty mówią, że zawiera HRESULT, ale zwykle jest to Exception.HResult. Jeśli chcesz mieć nadzieję na przydatny kod błędu, możesz sprawdzić ViewStateException.HResult i zobaczyć, co tam jest. – MNGwinn

1

Oto co wdrożyliśmy pomóc licznik błędów viewstate w globa.asax:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 

    Dim context As HttpContext = HttpContext.Current 
    Dim exception As Exception = Server.GetLastError 

    'custom exception handling: 
    If Not IsNothing(exception) Then 

     If Not IsNothing(exception.InnerException) Then 

      'ViewState Exception: 
      If exception.InnerException.GetType = GetType(ViewStateException) Then 
       'The state information is invalid for this page and might be corrupted. 

       'Caused by VIEWSTATE|VIEWSTATEENCRYPTED|EVENTVALIDATION hidden fields being malformed 
       ' + could be page is submitted before being fully loaded 
       ' + hidden fields have been malformed by proxies or user tampering 
       ' + hidden fields have been trunkated by mobile devices 
       ' + remotly loaded content into the page using ajax causes the hidden fields to be overridden with incorrect values (when a user navigates back to a cached page) 

       'Remedy: reload the request page to replenish the viewstate: 
       Server.ClearError() 
       Response.Clear() 
       Response.Redirect(context.Request.Url.ToString, False) 
       Exit Sub 
      End If 

     End If 

    End If 

End Sub 
Powiązane problemy