Estou retornando um NotFound IHttpActionResult
, quando algo não é encontrado na minha ação GET do WebApi. Junto com esta resposta, desejo enviar uma mensagem personalizada e / ou a mensagem de exceção (se houver). O atual ApiController
's NotFound()
método não fornece uma sobrecarga para passar uma mensagem.
Existe alguma maneira de fazer isso? ou terei que escrever meu próprio costume IHttpActionResult
?
c#
asp.net-web-api
http-status-code-404
httpresponse
Ajay Jadhav
fonte
fonte
Respostas:
Você precisaria escrever seu próprio resultado de ação se quiser personalizar o formato da mensagem de resposta.
Queríamos fornecer os formatos de mensagem de resposta mais comuns prontos para uso, como 404s vazios simples, mas também queríamos manter esses resultados o mais simples possível; uma das principais vantagens de usar resultados de ação é que torna o seu método de ação muito mais fácil para o teste de unidade. Quanto mais propriedades colocamos nos resultados da ação, mais coisas seu teste de unidade precisa considerar para ter certeza de que o método de ação está fazendo o que você espera.
Freqüentemente, desejo também a capacidade de fornecer uma mensagem personalizada, então sinta-se à vontade para registrar um bug para que possamos considerar apoiar esse resultado de ação em uma versão futura: https://aspnetwebstack.codeplex.com/workitem/list/advanced
Uma coisa boa sobre os resultados da ação, porém, é que você sempre pode escrever seus próprios facilmente se quiser fazer algo ligeiramente diferente. Veja como você pode fazer no seu caso (supondo que você queira a mensagem de erro em texto / simples; se quiser JSON, faria algo um pouco diferente com o conteúdo):
Então, em seu método de ação, você pode simplesmente fazer algo assim:
Se você usou uma classe base do controlador personalizado (em vez de herdar diretamente do ApiController), também pode eliminar o "this". parte (que infelizmente é necessária ao chamar um método de extensão):
fonte
Aqui está uma linha para retornar um IHttpActionResult NotFound com uma mensagem simples:
fonte
Você pode usar
ResponseMessageResult
se quiser:sim, se você precisa de versões mais curtas, então acho que você precisa implementar seu resultado de ação personalizada.
fonte
Você pode usar a propriedade ReasonPhrase da classe HttpResponseMessage
fonte
Você pode criar um resultado de conteúdo negociado personalizado conforme sugerido pelo d3m3t3er. No entanto, eu herdaria. Além disso, se você precisar apenas para retornar NotFound, não será necessário inicializar o status http do construtor.
fonte
Eu resolvi isso simplesmente derivando
OkNegotiatedContentResult
e substituindo o código HTTP na mensagem de resposta resultante. Esta classe permite que você retorne o corpo do conteúdo com qualquer código de resposta HTTP.fonte
Se você herda da base
NegotitatedContentResult<T>
, como mencionado, e não precisa transformar o seucontent
(por exemplo, você quer apenas retornar uma string), não precisa sobrescrever oExecuteAsync
método.Tudo o que você precisa fazer é fornecer uma definição de tipo apropriada e um construtor que diga à base qual código de status HTTP retornar. Todo o resto simplesmente funciona.
Aqui estão alguns exemplos para
NotFound
eInternalServerError
:E então você pode criar métodos de extensão correspondentes para
ApiController
(ou fazer isso em uma classe base se você tiver uma):E então eles funcionam exatamente como os métodos integrados. Você pode chamar o existente
NotFound()
ou pode chamar o seu novo personalizadoNotFound(myErrorMessage)
.E, claro, você pode se livrar dos tipos de string "embutidos no código" nas definições de tipo personalizado e deixá-los genéricos se quiser, mas então você pode ter que se preocupar com as
ExecuteAsync
coisas, dependendo do que você<T>
realmente é.Você pode examinar o código-fonte para
NegotiatedContentResult<T>
ver tudo o que ele faz. Não há muito a fazer.fonte
Eu estava precisando criar uma
IHttpActionResult
instância no corpo de umaIExceptionHandler
classe, a fim de definir aExceptionHandlerContext.Result
propriedade. No entanto, também queria definir um costumeReasonPhrase
.Descobri que um
ResponseMessageResult
poderia envolver umHttpResponseMessage
(o que permite que ReasonPhrase seja definido facilmente).Por exemplo:
fonte
Eu sei que PO perguntou com um texto de mensagem, mas outra opção para apenas retornar um 404 é fazer o método retornar um IHttpActionResult e usar a função StatusCode
fonte
As respostas aqui estão faltando um pequeno problema de história do desenvolvedor. A
ApiController
classe ainda está expondo umNotFound()
método que os desenvolvedores podem usar. Isso faria com que alguma resposta 404 contivesse um corpo de resultado não controlado.Apresento aqui algumas partes do código " melhor método ApiController NotFound " que fornecerá um método menos sujeito a erros que não exige que os desenvolvedores conheçam "a melhor maneira de enviar um 404".
ApiController
chamadaApiController
NotFound
método para permitir que os desenvolvedores usem a primeira API disponível[Obsolete("Use overload instead")]
protected NotFoundResult NotFound(string message)
que você deseja encorajarNegotiatedContentResult
. veja em anexo a melhor classe NotFoundResult .fonte