2011-02-17 12 views
17

Tengo este código para manejar HttpRequestValidationException en mi archivo global.asax.cs.Cómo atrapar HttpRequestValidationException en producción

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var exception = context.Server.GetLastError(); 
    if (exception is HttpRequestValidationException) 
    { 
     Response.Clear(); 
     Response.StatusCode = 200; 
     Response.Write(@"<html><head></head><body>hello</body></html>"); 
     Response.End(); 
     return; 
    } 
} 

Si depuro mi aplicación web, funciona perfecto. Pero cuando lo pongo en nuestro servidor de producción, el servidor lo ignora y genera el "una solicitud potencialmente peligrosa.se detectó un valor desde el cliente" - página de error. No sé lo que sucede exactamente ... Si alguien sabe cuál es el problema, o lo que hago mal ...?

Además, no quiero configurar validaterequest en falso en el web.config.

El servidor usa IIS7.5, y estoy usando asp.net 3.5.

Gracias, Bruno

Respuesta

10

Bueno, he encontrado mi auto. Debo borrar mi último error.

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var exception = context.Server.GetLastError(); 
    if (exception is HttpRequestValidationException) 
    { 
     context.Server.ClearError(); // Here is the new line. 
     Response.Clear(); 
     Response.StatusCode = 200; 
     Response.Write(@"<html><head></head><body>hello</body></html>"); 
     Response.End(); 
     return; 
    } 
} 
+2

No creo que necesite el "contexto" var. Funciona muy bien como "Server.GetLastError()" y "Server.ClearError()". – WildJoe

+0

Response.End() arroja una excepción por diseño. En su lugar, use esto: 'HttpContext.Current.ApplicationInstance.CompleteRequest'. Eche un vistazo a esto para la explicación: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end-response-redir – Kamran

4

Otra forma que sólo funciona con MVC está utilizando un filtro de excepción personalizada:

  • Crear una FilterAttribute personalizado que implementa IExceptionFilter
  • desde el interior del FilterAttribute, puede redirigir al controlador o ver para ser utilizado para mostrar el error.
  • registrar el filtro en el Global.asax o atributo de los controladores

Esto tiene la ventaja de que se puede utilizar la infraestructura normal de MVC (Razor) para renderizar la vista de error.

public class HttpRequestValidationExceptionAttribute : FilterAttribute, IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 
     if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) { 
      filterContext.Result = new RedirectResult("~/HttpError/HttpRequestValidationError"); 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 
+0

Gracias para compartir :-) Lo veré cuando tenga algo de tiempo libre :-) – bruno

+0

Siempre es un placer:> –

+0

Gracias por esto. Lo usé pero descubrí que filterContext.ExceptionHandled ya estaba configurado en true, por lo que el código en la sentencia if no se ejecutó y se mostró mi página de error predeterminada. Saqué esa condición y ahora parece funcionar perfectamente. No estoy seguro de si hacerlo podría causar problemas en otros lugares ... ¿algún pensamiento? ¡Gracias! – Kate

Cuestiones relacionadas