Estoy devolviendo un NotFound IHttpActionResult
, cuando no se encuentra algo en mi acción WebApi GET. Junto con esta respuesta, quiero enviar un mensaje personalizado y / o el mensaje de excepción (si corresponde). La corriente ApiController
's NotFound()
método no proporciona una sobrecarga para pasar un mensaje.
¿Hay alguna forma de hacer esto? o tendré que escribir mi propia costumbre IHttpActionResult
?
c#
asp.net-web-api
http-status-code-404
httpresponse
Ajay Jadhav
fuente
fuente
Respuestas:
Debería escribir el resultado de su propia acción si desea personalizar la forma del mensaje de respuesta.
Queríamos proporcionar las formas de mensaje de respuesta más comunes listas para usar para cosas como simples 404 vacíos, pero también queríamos mantener estos resultados lo más simples posible; Una de las principales ventajas de utilizar los resultados de la acción es que hace que su método de acción sea mucho más fácil de realizar pruebas unitarias. Cuantas más propiedades pongamos en los resultados de la acción, más cosas debe tener en cuenta la prueba unitaria para asegurarse de que el método de acción está haciendo lo que usted espera.
A menudo también quiero la capacidad de proporcionar un mensaje personalizado, así que no dude en registrar un error para que consideremos respaldar ese resultado de acción en una versión futura: https://aspnetwebstack.codeplex.com/workitem/list/advanced
Sin embargo, una cosa buena acerca de los resultados de las acciones es que siempre puedes escribir los tuyos con bastante facilidad si quieres hacer algo ligeramente diferente. Así es como puede hacerlo en su caso (suponiendo que desee el mensaje de error en texto / plano; si desea JSON, haría algo ligeramente diferente con el contenido):
Luego, en su método de acción, puede hacer algo como esto:
Si usó una clase base de controlador personalizado (en lugar de heredar directamente de ApiController), también podría eliminar el "esto". part (que desafortunadamente se requiere cuando se llama a un método de extensión):
fuente
Aquí hay una sola línea para devolver un IHttpActionResult NotFound con un mensaje simple:
fuente
Podría usar
ResponseMessageResult
si lo desea:sí, si necesita versiones mucho más cortas, supongo que debe implementar el resultado de su acción personalizada.
fuente
Puede usar la propiedad ReasonPhrase de la clase HttpResponseMessage
fuente
Puede crear un resultado de contenido negociado personalizado como sugirió d3m3t3er. Sin embargo, heredaría de. Además, si solo lo necesita para devolver NotFound, no necesita inicializar el estado http desde el constructor.
fuente
Lo resolví simplemente derivando
OkNegotiatedContentResult
y anulando el código HTTP en el mensaje de respuesta resultante. Esta clase le permite devolver el cuerpo del contenido con cualquier código de respuesta HTTP.fuente
Si hereda de la base
NegotitatedContentResult<T>
, como se mencionó, y no necesita transformar sucontent
(por ejemplo, solo desea devolver una cadena), entonces no necesita anular elExecuteAsync
método.Todo lo que necesita hacer es proporcionar una definición de tipo adecuada y un constructor que le indique a la base qué código de estado HTTP debe devolver. Todo lo demás simplemente funciona.
Aquí hay ejemplos para ambos
NotFound
yInternalServerError
:Y luego puede crear los métodos de extensión correspondientes para
ApiController
(o hacerlo en una clase base si tiene una):Y luego funcionan como los métodos integrados. Puede llamar al existente
NotFound()
o puede llamar a su nuevo personalizadoNotFound(myErrorMessage)
.Y, por supuesto, puede deshacerse de los tipos de cadenas "codificados" en las definiciones de tipos personalizados y dejarlos genéricos si lo desea, pero luego puede que tenga que preocuparse por las
ExecuteAsync
cosas, dependiendo de lo que<T>
realmente sea.Puede revisar el código fuente para
NegotiatedContentResult<T>
ver todo lo que hace. No hay mucho que hacer.fuente
Necesitaba crear una
IHttpActionResult
instancia en el cuerpo de unaIExceptionHandler
clase para establecer laExceptionHandlerContext.Result
propiedad. Sin embargo, también quería establecer un archivo personalizadoReasonPhrase
.Descubrí que a
ResponseMessageResult
podría envolver aHttpResponseMessage
(lo que permite que ReasonPhrase se configure fácilmente).Por ejemplo:
fuente
Sé que PO preguntó con un mensaje de texto, pero otra opción para devolver un 404 es hacer que el método devuelva un IHttpActionResult y use la función StatusCode
fuente
A las respuestas aquí les falta un pequeño problema de la historia del desarrollador. La
ApiController
clase todavía expone unNotFound()
método que los desarrolladores pueden usar. Esto provocaría que alguna respuesta 404 contenga un cuerpo de resultado no controlado.Presento aquí algunas partes del código " mejor método ApiController NotFound " que proporcionará un método menos propenso a errores que no requiere que los desarrolladores conozcan "la mejor manera de enviar un 404".
ApiController
llamadaApiController
NotFound
método para permitir que los desarrolladores usen la primera API disponible[Obsolete("Use overload instead")]
protected NotFoundResult NotFound(string message)
que quieras animarNegotiatedContentResult
. ver adjunta mejor la clase NotFoundResult .fuente