2012-08-30 29 views
5

Soy nuevo en los formularios web aspx.Captura solo una HttpException específica

Quiero ver una excepción específica en mi aplicación web - Validation of viewstate MAC failed.
yo probamos este (en Global.asax.cs):

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

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

El problema es que las capturas de todos los HttpExceptions no controladas.

¿Cuál es la mejor manera de lograr esto?


edición:

Mientras que el registro esta cuestión me encontré con que la excepción interna es un ViewStateException, pero no parecen tener un "errorCode" atributo específico

Gracias

+0

¿Qué desea hacer con las otras excepciones no controladas? – MNGwinn

+2

Creo que ese casting puede causar una excepción. Debe probar como 'if (Server.GetLastError() es HttpException) {...}' –

+0

@MNGwinn - Realmente no importa, quiero hacer una "cosa diferente" luego cuando es la 'Validación de viewstate MAC failed' – Bassal

Respuesta

5

Esto debería hacerlo

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

The HttpExce ption está diseñado para hacer que todas las cosas relacionadas con HTTP/web sean detectables por un controlador, por lo que necesita profundizar y observar la excepción original. ViewStateException podría detectar un par de otros errores relacionados con View State, pero eso probablemente sea correcto.

+0

Gracias, esto es lo que descubrí también (ver mi edición). ¿No hay forma de ver qué error de estado de vista se lanzó? – Bassal

+0

Probablemente su mejor opción sea simplemente verificar todas las propiedades de viewstateexception durante la depuración para ver si alguna de ellas lo distingue. De lo contrario, podría simplemente verificar el mensaje de la excepción para la "validación específica de viewstate mac failed". – ryanulit

+0

La propiedad ErrorCode en HttpException no se hereda de Exception, y ViewStateException no se deriva de HttpException, por lo que no esperaría verla. Los documentos dicen que contiene un HRESULT, pero eso normalmente está en Exception.HResult. Si desea esperar un código de error útil, puede verificar ViewStateException.HResult y ver qué hay allí. – MNGwinn

1

Esto es lo que hemos puesto en marcha para ayudar a los errores de contador de ViewState en 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 
Cuestiones relacionadas