2012-09-04 14 views
5

Estoy tratando de devolver los códigos Http adecuados y las respuestas de mi aplicación, pero estoy luchando. Parece que hay 2 formas de devolver respuestas http específicas.Lanzar HttpResponseException en el método de acción WebAPI que devuelve la respuesta 200 vacía

La forma en que quiero tratar con él es lanzando un HttpResponseException:

public Information Get(int apiKey) 
{ 
    if (!_users.Authenticate(apiKey)) 
    { 
     var response = new HttpResponseMessage(); 
     response.StatusCode = (HttpStatusCode)401; 
     response.ReasonPhrase = "ApiKey invalid"; 

     throw new HttpResponseException(response); 
    } 

    return _info.Get(); 
} 

Sin embargo, cuando hago esto la respuesta que veo es sólo una respuesta vacía 200!

También parece que también puede cambiar la firma de su método de acción para devolver un HttpResponseMessage así:

public HttpResponseMessage Get() 
{ 
    if (!_users.Authenticate(apiKey)) 
    { 
     return Request.CreateResponse((HttpStatusCode) 401, "ApiKey invalid"); 
    } 

    return Request.CreateResponse((HttpStatusCode) 200, _info.Get()); 
} 

Realmente no quiero hacer esto si puedo evitarlo, me haría mucho más bien tengo mi tipo de devolución como el objeto que estoy tratando de recuperar en lugar de envolverlo cada vez en un HttpResponseMessage.

¿Hay alguna razón por la cual el primer método devuelva un 200 vacío en lugar del 401 con el mensaje como yo quiero?

Respuesta

5

Dos posibles soluciones;

Primero. Make sure your IIS is configured to let errors pass through

<configuration> 
    <system.webServer> 
    <httpErrors existingResponse="PassThrough" /> 
    </system.webServer> 
</configuration> 

Segunda. No estoy del todo seguro, pero ASP.NET Web API may require you to develop a custom ActionFilter to properly translate Exceptions to result types. Esta es la forma en que personalmente hago el tratamiento de errores en la API Web:

  1. permitir que cualquier tipo de excepción para ser lanzado en el API de Web, al igual que lo haría en cualquier otra aplicación .NET
  2. Escribe un ActionFilter personalizado que capta Excepciones y las traduce al formato apropiado. Por ejemplo, serializo todas las excepciones en un formato JSON personalizado. En el lado del cliente, tengo algunos trucos AJAX personalizados que pueden manejar errores (como excepciones de validación) basados ​​en este formato.
+0

aplausos por eso - Terminé usando un filtro para hacer frente a las excepciones al final, gracias a que me apunta hacia ese artículo de msdn – jcvandan

1

Compruebe la configuración IncludeErrorDetailPolicy en HttpConfiguration. De forma predeterminada, la política es mostrar los detalles del error al acceder localmente a la API web.

+0

gracias por eso voy a investigarlo – jcvandan

Cuestiones relacionadas