Estou desenvolvendo com o WebApi e fui para o WebApi2, onde a Microsoft introduziu uma nova IHttpActionResult
interface que parece recomendada para ser usada no retorno de a HttpResponseMessage
. Estou confuso sobre as vantagens desta nova interface. Parece fornecer apenas uma maneira ligeiramente mais fácil de criar um HttpResponseMessage
.
Eu argumentaria que isso é "abstração em prol da abstração". Estou esquecendo de algo? Quais são as vantagens do mundo real que recebo ao usar essa nova interface, além de talvez salvar uma linha de código?
Maneira antiga (WebApi):
public HttpResponseMessage Delete(int id)
{
var status = _Repository.DeleteCustomer(id);
if (status)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
Nova maneira (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
fonte
fonte
HttpResponseMessage
, recebi a resposta em 9545 ms . * Usando oIHttpActionResult
, recebi a mesma resposta em 294 ms .Respostas:
Você pode optar por não usar,
IHttpActionResult
porque o código existente cria umHttpResponseMessage
que não se encaixa em uma das respostas em lata. No entanto, você pode se adaptarHttpResponseMessage
aoIHttpActionResult
uso da resposta enlatada deResponseMessage
. Demorei um pouco para descobrir isso, então eu queria publicá-lo mostrando que você não precisa necessariamente escolher um ou outro:Observe que
ResponseMessage
é um método da classe baseApiController
que seu controlador deve herdar.fonte
ResponseMessage
eResponseMessageResult
são duas coisas diferentes.ResponseMessage()
é um método doApiController
qual seu controlador deve herdar e, portanto, é apenas uma chamada de método. Portanto, nenhumanew
palavra-chave é necessária lá. Você provavelmente não está herdandoApiController
ou está dentro de um método estático.ResponseMessageResult
é o tipo de retorno deResponseMessage()
.response = base.ResponseMessage(responseMsg)
para torná-lo mais claro que é um método do ApiController classe baseVocê ainda pode usar
HttpResponseMessage
. Essa capacidade não desaparece. Eu me senti da mesma maneira que você e argumentei extensivamente com a equipe que não havia necessidade de uma abstração adicional. Houve alguns argumentos para tentar justificar sua existência, mas nada que me convenceu de que valia a pena.Ou seja, até eu ver essa amostra de Brad Wilson . Se você construir
IHttpActionResult
classes de uma maneira que possa ser encadeada, você poderá criar um pipeline de resposta "no nível de ação" para gerar oHttpResponseMessage
. Nos bastidores, é assim queActionFilters
são implementadas, no entanto, a ordenaçãoActionFilters
delas não é óbvia ao ler o método de ação, que é uma das razões pelas quais eu não sou fã de filtros de ação.No entanto, ao criar um
IHttpActionResult
que possa ser explicitamente encadeado em seu método de ação, você poderá compor todos os tipos de comportamentos diferentes para gerar sua resposta.fonte
Aqui estão vários benefícios mencionados
IHttpActionResult
acimaHttpResponseMessage
na documentação do Microsoft ASP.Net :Mas aqui estão algumas outras vantagens do uso que
IHttpActionResult
vale a pena mencionar:Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( link para a lista completa )ExecuteAsync
método.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
para converter HttpResponseMessage em IHttpActionResult .fonte
fonte
Esta é apenas a minha opinião pessoal e o pessoal da equipe de APIs da web provavelmente pode articular melhor, mas aqui está o meu 2c.
Antes de tudo, acho que não se trata de um sobre o outro. Você pode usá-los tanto dependendo do que você quer fazer em seu método de ação, mas a fim de compreender o verdadeiro poder
IHttpActionResult
, você provavelmente terá que passo fora desses métodos auxiliares convenientes deApiController
tais comoOk
,NotFound
, etc.Basicamente, acho que uma classe implementada
IHttpActionResult
como uma fábrica deHttpResponseMessage
. Com essa mentalidade, agora se torna um objeto que precisa ser devolvido e uma fábrica que o produz. No sentido geral de programação, você pode criar o objeto em certos casos e, em certos casos, precisa de uma fábrica para fazer isso. O mesmo aqui.Se você deseja retornar uma resposta que precisa ser construída por meio de uma lógica complexa, digamos muitos cabeçalhos de resposta, etc., você pode abstrair toda essa lógica em uma classe de resultado de ação implementada
IHttpActionResult
e usá-la em vários métodos de ação para retornar a resposta.Outra vantagem de usar
IHttpActionResult
como tipo de retorno é que ele torna o método de ação da API da Web do ASP.NET semelhante ao MVC. Você pode retornar qualquer resultado de ação sem ser pego nos formatadores de mídia.Obviamente, como observado por Darrel, você pode encadear os resultados das ações e criar um micro-pipeline poderoso semelhante aos próprios manipuladores de mensagens no pipeline da API. Isso será necessário dependendo da complexidade do seu método de ação.
Para encurtar a história - não é
IHttpActionResult
contraHttpResponseMessage
. Basicamente, é assim que você deseja criar a resposta. Faça você mesmo ou através de uma fábrica.fonte
ResponseFactory.CreateOkResponse()
esse, retornando HttpResponseMessage, e não precisei lidar com o material assíncrono ao criar a resposta. Um membro da equipe mencionou o fato de que a assíncrona pode ser útil se você precisar fazer E / S para gerar valores de cabeçalho. Não sei quantas vezes isso acontece.A API Web retornar basicamente 4 tipo de objeto:
void
,HttpResponseMessage
,IHttpActionResult
, e outros tipos fortes. A primeira versão da API da Web retorna, oHttpResponseMessage
que é uma mensagem de resposta HTTP bastante direta.O
IHttpActionResult
foi introduzido pelo WebAPI 2, que é uma espécie de quebra deHttpResponseMessage
. Ele contém oExecuteAsync()
método para criar umHttpResponseMessage
. Simplifica o teste de unidade do seu controlador.Outro tipo de retorno são tipos de classes de tipo forte serializadas pela API da Web usando um formatador de mídia no corpo da resposta. A desvantagem foi que você não pode retornar diretamente um código de erro como o 404. Tudo o que você pode fazer é gerar um
HttpResponseException
erro.fonte
Prefiro implementar a função de interface TaskExecuteAsync para IHttpActionResult. Algo como:
, em que _request é o HttpRequest e _respContent é a carga útil.
fonte
Temos os seguintes benefícios do uso
IHttpActionResult
excessivoHttpResponseMessage
:IHttpActionResult
, estamos nos concentrando apenas nos dados a serem enviados e não no código de status. Portanto, aqui o código será mais limpo e fácil de manter.async
eawait
por padrão.fonte