2012-08-30 14 views
5

Ich bin neu bei ASPX Webforms.Catch nur eine bestimmte HttpException

Ich möchte eine bestimmte Ausnahme in meiner Webanwendung abfangen - Validation of viewstate MAC failed. diese
Ich habe versucht (in Global.asax.cs):

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

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

Das Problem ist, dass es alle nicht behandelte HttpExceptions fängt.

Was ist der beste Weg, dies zu erreichen?


edit:

Bei der Überprüfung dieses Problem weiter fand ich, dass die innere Ausnahme ein ViewStateException ist, aber es scheint nicht zu einem bestimmten „Errorcode“ -Attribut

Dank hat

+0

Was tun Sie mit den anderen nicht behandelte Ausnahmen zu tun? – MNGwinn

+2

Ich glaube, dass dieses Casting eine Ausnahme selbst verursachen kann. Sie sollten testen wie 'if (Server.GetLastError() ist HttpException) {...}' –

+0

@MNGwinn - Es ist nicht wirklich wichtig, ich möchte eine "andere Sache" dann tun, wenn es die Validierung von Viewstate MAC ist gescheitert? – Bassal

Antwort

5

Dies sollte es tun

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

Die HttpExce ption ist so konzipiert, dass alle HTTP/Web-bezogenen Dateien von einem Handler abgefangen werden können. Sie müssen also nachschauen und sich die ursprüngliche Ausnahme ansehen. ViewStateException kann einige andere Fehler im Zusammenhang mit dem Anzeigestatus anzeigen, aber das ist wahrscheinlich in Ordnung.

+0

Danke, das habe ich auch herausgefunden (siehe meine Bearbeitung). Gibt es keine Möglichkeit zu sehen, welcher Ansichtsstatusfehler ausgelöst wurde? – Bassal

+0

Ihre beste Wette besteht wahrscheinlich darin, alle Eigenschaften der viewstateexception während des Debuggens zu überprüfen, um festzustellen, ob sie von anderen unterschieden werden. Andernfalls könnten Sie einfach die Nachricht der Ausnahme für die spezifische "Validierung von Viewstate Mac fehlgeschlagen" überprüfen. – ryanulit

+0

Die ErrorCode-Eigenschaft für HttpException wird nicht von Exception geerbt, und ViewStateException leitet sich nicht von HttpException ab, daher würde ich nicht erwarten, sie zu sehen. Docs sagen, dass es ein HRESULT enthält, aber das ist normalerweise in Exception.HResult. Wenn Sie auf einen nützlichen Fehlercode hoffen möchten, können Sie ViewStateException.HResult überprüfen und sehen, was da ist. – MNGwinn

1

Hier ist, was wir umgesetzt haben Zähler Viewstate Fehler in globa.asax zu helfen:

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 
Verwandte Themen