He estado desarrollando con WebApi y he pasado a WebApi2, donde Microsoft ha introducido una nueva IHttpActionResult
interfaz que parece recomendada para usarse antes de devolver a HttpResponseMessage
. Estoy confundido sobre las ventajas de esta nueva interfaz. Parece que principalmente proporciona una manera LIGERAMENTE más fácil de crear un HttpResponseMessage
.
Yo diría que esto es "abstracción por el bien de la abstracción". ¿Me estoy perdiendo de algo? ¿Cuáles son las ventajas del mundo real que obtengo al usar esta nueva interfaz además de guardar una línea de código?
Old way (WebApi):
public HttpResponseMessage Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
Nueva forma (WebApi2):
public IHttpActionResult Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
//return new HttpResponseMessage(HttpStatusCode.OK);
return Ok();
}
else
{
//throw new HttpResponseException(HttpStatusCode.NotFound);
return NotFound();
}
}
c#
asp.net-web-api
httpresponse
Jason Roell
fuente
fuente
HttpResponseMessage
obtuve la respuesta en 9545 ms . * Utilizando elIHttpActionResult
, obtuve la misma respuesta en 294 ms .Respuestas:
Puede decidir no usarlo
IHttpActionResult
porque su código existente crea unoHttpResponseMessage
que no se ajusta a una de las respuestas enlatadas. Sin embargo, puede adaptarseHttpResponseMessage
aIHttpActionResult
usar la respuesta enlatada deResponseMessage
. Me tomó un tiempo resolver esto, así que quería publicarlo mostrando que no necesariamente tienes que elegir uno u otro:Tenga en cuenta que
ResponseMessage
es un método de la clase baseApiController
que su controlador debe heredar.fuente
ResponseMessage
yResponseMessageResult
son dos cosas diferentes.ResponseMessage()
es un método delApiController
cual su controlador debería heredar y, por lo tanto, es solo una llamada al método. Entonces nonew
se necesita una palabra clave allí. Probablemente no estás heredandoApiController
o estás dentro de un método estático.ResponseMessageResult
es el tipo de retorno deResponseMessage()
.response = base.ResponseMessage(responseMsg)
para aclarar que es un método de la clase base ApiControllerAún puedes usar
HttpResponseMessage
. Esa capacidad no desaparecerá. Sentí lo mismo que usted y discutí extensamente con el equipo que no había necesidad de una abstracción adicional. Hubo algunos argumentos para tratar de justificar su existencia, pero nada que me convenció de que valiera la pena.Es decir, hasta que vi esta muestra de Brad Wilson . Si construye
IHttpActionResult
clases de una manera que se puede encadenar, obtendrá la capacidad de crear un canal de respuesta de "nivel de acción" para generar elHttpResponseMessage
. Debajo de las cubiertas, así es comoActionFilters
se implementan, sin embargo, el orden de estosActionFilters
no es obvio al leer el método de acción, que es una razón por la que no soy un fanático de los filtros de acción.Sin embargo, al crear un
IHttpActionResult
que se puede encadenar explícitamente en su método de acción, puede componer todo tipo de comportamiento diferente para generar su respuesta.fuente
Aquí hay varios beneficios de
IHttpActionResult
másHttpResponseMessage
mencionado en Microsoft ASP.Net de Documentación :Pero aquí hay algunas otras ventajas de usar que
IHttpActionResult
vale la pena mencionar:Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( enlace a la lista completa )ExecuteAsync
método.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
para convertir HttpResponseMessage a IHttpActionResult .fuente
fuente
Esta es solo mi opinión personal y la gente del equipo de API web probablemente pueda expresarlo mejor, pero aquí está mi 2c.
En primer lugar, creo que no se trata de uno sobre otro. Puede usarlos según lo que desee hacer en su método de acción, pero para comprender el poder real de
IHttpActionResult
, es probable que necesite salir de esos métodos auxiliares convenientesApiController
comoOk
, por ejemplo ,NotFound
, etc.Básicamente, creo que una clase implementada
IHttpActionResult
como una fábrica deHttpResponseMessage
. Con esa mentalidad, ahora se convierte en un objeto que necesita ser devuelto y en una fábrica que lo produce. En el sentido de programación general, puede crear el objeto usted mismo en ciertos casos y, en ciertos casos, necesita una fábrica para hacerlo. Igual que aquí.Si desea devolver una respuesta que necesita ser construida a través de una lógica compleja, digamos muchos encabezados de respuesta, etc., puede abstraer toda esa lógica en una clase de resultado de acción implementada
IHttpActionResult
y usarla en múltiples métodos de acción para devolver la respuesta.Otra ventaja de usar
IHttpActionResult
como tipo de retorno es que hace que el método de acción API web ASP.NET sea similar a MVC. Puede devolver cualquier resultado de acción sin quedar atrapado en los formateadores de medios.Por supuesto, como señaló Darrel, puede encadenar los resultados de la acción y crear una potente microtubería similar a los propios manejadores de mensajes en la canalización API. Esto lo necesitará dependiendo de la complejidad de su método de acción.
Larga historia corta: no es
IHttpActionResult
versusHttpResponseMessage
. Básicamente, es cómo quieres crear la respuesta. Hágalo usted mismo o a través de una fábrica.fuente
ResponseFactory.CreateOkResponse()
que devuelve HttpResponseMessage, y no tuve que lidiar con las cosas asíncronas al crear la respuesta. Un miembro del equipo mencionó el hecho de que el asíncrono puede ser útil si necesita hacer E / S para generar valores de encabezado. Sin embargo, no estoy seguro de con qué frecuencia sucede eso.La API de Web básicamente de retorno 4 tipo de objeto:
void
,HttpResponseMessage
,IHttpActionResult
, y otros tipos fuertes. La primera versión de la API web regresa,HttpResponseMessage
que es un mensaje de respuesta HTTP bastante sencillo.El
IHttpActionResult
fue introducido por WebAPI 2, que es una especie de envoltura deHttpResponseMessage
. Contiene elExecuteAsync()
método para crear unHttpResponseMessage
. Simplifica las pruebas unitarias de su controlador.Otro tipo de retorno son clases de tipo fuerte serializadas por la API web utilizando un formateador de medios en el cuerpo de la respuesta. El inconveniente es que no puede devolver directamente un código de error como un 404. Todo lo que puede hacer es arrojar un
HttpResponseException
error.fuente
Prefiero implementar la función de interfaz TaskExecuteAsync para IHttpActionResult. Algo como:
, donde _request es HttpRequest y _respContent es la carga útil.
fuente
Tenemos los siguientes beneficios de usar
IHttpActionResult
más deHttpResponseMessage
:IHttpActionResult
solo nos estamos concentrando en los datos que se enviarán, no en el código de estado. Así que aquí el código será más limpio y muy fácil de mantener.async
yawait
por defecto.fuente