2011-08-23 12 views
6

Estoy intentando validar una solicitud HTTP recibida por un servicio. Quiero comprobar si todos los encabezados necesarios están presentes, etc. De lo contrario, me gustaría lanzar una excepción, que, en algún lugar, establecería un código de respuesta y una línea de estado de la respuesta adecuada. No deseo redirigir al usuario a ninguna página de error específica, solo envíe la respuesta.¿Cuál es la forma correcta de validar solicitudes HTTP y devolver respuestas HTTP específicas en Global.asax?

Me pregunto dónde debería poner el código? Mi primera conjetura fue validar las solicitudes en Application_BeginRequest, lanzar una excepción por error y manejarlo en Application_Error.

Por ejemplo:

public void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if(!getValidator.Validate(HttpContext.Current.Request)) 
    { 
     throw new HttpException(486, "Something dark is coming"); 
    } 
} 

public void Application_Error(object sender, EventArgs e) 
{ 
    HttpException ex = Server.GetLastError() as HttpException; 
    if (ex != null) 
    { 
      Context.Response.StatusCode = ex.ErrorCode; 
      Context.Response.Status = ex.Message; 
    } 
} 

Al parecer, en estos casos, Visual Studio se queja de una excepción no controlada en Application_BeginRequest. Funciona, ya que el código dado se devuelve al cliente, pero creo que algo está mal con este enfoque.

[Editar]: He eliminado la segunda pregunta sobre la línea de estado personalizada, ya que estas preguntas no están realmente conectadas.

Gracias por la ayuda.

+0

¿Dónde entra WCF aquí? ¿Está creando un servicio REST alojado en IIS? –

+0

Bueno, sí. Creo que es una de las opciones, se opone a alojar un servicio como un servicio administrado de Windows/aplicación administrada (según msdn) –

Respuesta

6

Visual Studio interrumpe la ejecución de forma predeterminada cuando se produce una excepción. Puede cambiar este comportamiento yendo a Depurar -> Excepciones y desmarcar las casillas de verificación junto a las excepciones comunes de tiempo de ejecución del idioma. Sin embargo, el principal problema aquí es que estás lanzando una excepción solo para que puedas atraparla y establecer el código de estado en la respuesta. Puedes hacer eso sin lanzar una excepción. p.ej. void Application_BeginRequest(object sender, EventArgs e) { if(!getValidator.Validate(HttpContext.Current.Request)) { HttpContext.Current.Response.StatusCode = 403 var httpApplication = sender as HttpApplication; httpApplication.CompleteRequest(); } }

+0

¡Eso resuelve mi problema, muchas gracias! –

Cuestiones relacionadas