2012-04-26 14 views
9

Estoy intentando escribir servicios web verdaderamente RESTful a través de HTTP utilizando ASP.NET MVC 4 Web API.Diferentes tipos de devolución para ASP.NET Web API

El reto actual que tengo es devolver diferentes tipos de devolución (entidad-cuerpo) en función de mi código de estado.

Por ejemplo, para Hammer recurso que tienen una clase de modelo .NET "Hammer", y una HammerController:

namespace Awesomeness 
{ 
    public class HammerController : ApiController 
    { 
     public Hammer Get(int id) 
     { 
     } 
... 

Si el ID no existe (404) o se necesita autorización diferente (401), Puedo atajar fácilmente la devolución y configurar manualmente el código de estado y cualquier otro contenido, lo cual es genial. Sin embargo, en muchos estados que no son 2xx, quiero devolver un cuerpo de entidad diferente de la representación de recursos de Hammer. Puedo hacerlo fácilmente de forma manual, pero me gustaría aprovechar la serialización y deserialización automáticas ASP.NET MVC 4 Web API hacia/desde XML o JSON dependiendo de los encabezados de las solicitudes.

Así que mi pregunta principal es: ¿Puedo aprovechar la serialización automágica ASP.NET MVC 4 Web API al tiempo que devuelvo diferentes tipos de devolución?

Algunos enfoques potenciales he pensado son:

  1. tiene el método del controlador de devolver el principal tipo de recursos, pero un cortocircuito en la declaración con HttpContext.Current.Response y de alguna manera gancho en la serialización automagic (preferido).

  2. Haga que mi clase de modelo sea más parecida a una unión C donde represente este tipo o ese tipo y permita que se serialice como parte del proceso de devolución normal (y anule el código de estado y los encabezados de respuesta necesarios). Incluso si pienso en cómo hacer esto, tengo la sensación de que todavía terminará siendo muy hacky.

Editado 27 de Abr 2012: puedo lanzar un HttpResponseException como esto:

HttpResponseMessage response = new HttpResponseMessage(statusCode); 
if (!string.IsNullOrWhiteSpace(text)) 
{ 
    response.Content = new StringContent(text); 
} 
throw new HttpResponseException(response); 

... pero ahora tengo que encontrar la manera de gancho en la serialización auto-magia y establece el response.Content al Accept encabezado de representación negociada.

Respuesta

15

Obtuve la respuesta clara a esta pregunta de una respuesta que recibí en this other question.

Si hago mi valor de retorno HttpResponseMessage, puedo devolver cualquier estado o contenido que necesite devolviendo un new HttpResponseMessage().

EDITAR 5/10/2012: Gracias a la entrada de @DarrelMiller, eliminado en desuso HttpResponseMessage<T> y reemplazado con llamada a HttpRequestMessage.CreateResponse<T>() método de extensión. NOTA: Este método de extensión no está disponible en la versión beta de MVC4/WebAPI. Necesita build from source o obtener el nightly build.

ejemplo excesivamente simplificada:

public HttpResponseMessage Post(MyResource myResource) 
{ 
    ... 
    if (goodStuff) 
    { 
     return ControllerContext.Request.CreateResponse(HttpStatusCode.Created, myNewResource); 
    } 
    else if (badStuff) 
    { 
     return ControllerContext.Request.CreateResponse(HttpStatusCode.BadRequest, badRequest); 
    } 
    else 
    { 
     return new HttpResponseMessage(HttpStatusCode.InternalServerError); 
    } 
} 
+0

Gracias para la edición. Estuve buscando todo el día para obtener HttpResponseMessage para que funcione con mi versión beta instalada ... – Max

+0

¿por qué HttpResponseMessage no tiene una sobrecarga para 'crear una respuesta'? –

+2

@Simon_Weaver - Supongo que está creando un HttpResponseMessage en respuesta a HttpRequestMessage, por lo que utiliza la solicitud de contexto sobre cómo hacer la respuesta. – MikeJansen

Cuestiones relacionadas