Estoy tratando de devolver un código de estado de 304 no modificado para un método GET en un controlador de API web.
La única forma en que tuve éxito fue algo como esto:
public class TryController : ApiController
{
public User GetUser(int userId, DateTime lastModifiedAtClient)
{
var user = new DataEntities().Users.First(p => p.Id == userId);
if (user.LastModified <= lastModifiedAtClient)
{
throw new HttpResponseException(HttpStatusCode.NotModified);
}
return user;
}
}
El problema aquí es que no es una excepción, simplemente no se modifica, por lo que el caché del cliente está bien. También quiero que el tipo de retorno sea un Usuario (como se muestra en todos los ejemplos de API web con GET), no devolver HttpResponseMessage o algo así.
beta
o construcción nocturna ?new HttpResponseMessage(HttpStatusCode.NotModified)
? ¿No funciona?Respuestas:
No sabía la respuesta, así que pregunté al equipo de ASP.NET aquí .
Entonces, el truco es cambiar la firma
HttpResponseMessage
y usarlaRequest.CreateResponse
.fuente
GetUser(request, id, lastModified).TryGetContentValue(out user)
, dondeuser
(en el caso del ejemplo) es unUser
objeto.IHttpActionResult
y desea devolver el Usuario, simplemente puede hacerloreturn Ok(user)
. Si necesita devolver otro código de estado (por ejemplo, prohibido), puede hacerloreturn this.StatusCode(HttpStatusCode.Forbidden)
.También puede hacer lo siguiente si desea conservar la firma de la acción como Usuario recurrente:
Si desea devolver algo distinto de
200
eso, debe incluir un mensajeHttpResponseException
en su acción y pasar elHttpResponseMessage
mensaje que desea enviar al cliente.fuente
NotModified
es realmente un desperdicio. Si todas sus API hicieron esto, entonces su servidor convertirá principalmente vatios a excepciones.En MVC 5, las cosas se pusieron más fáciles:
fuente
Cambie el método de la API GetXxx para devolver HttpResponseMessage y luego devolver una versión con tipo para la respuesta completa y la versión sin tipo para la respuesta NotModified.
* Los datos de ClientHasStale son mi extensión para verificar los encabezados ETag e IfModifiedSince.
El marco MVC aún debe serializar y devolver su objeto.
NOTA
Creo que la versión genérica se está eliminando en alguna versión futura de la API web.
fuente
Odio encontrar artículos viejos, pero este es el primer resultado para esto en la búsqueda de Google y tuve un gran problema con este problema (incluso con el apoyo de ustedes). Así que aquí no pasa nada ...
Espero que mi solución ayude a aquellos que también estaban confundidos.
y luego simplemente heredar de BaseController
y luego usándolo
fuente
.net core 2.2 que devuelve el código de estado 304. Esto está usando un ApiController.
Opcionalmente, puede devolver un objeto con la respuesta
fuente
Para ASP.NET Web Api 2, esta publicación de MS sugiere cambiar el tipo de retorno del método a
IHttpActionResult
. A continuación, puede volver construido enIHttpActionResult
la aplicación comoOk
,BadRequest
, etc ( ver aquí ) o devolver su propia implementación.Para su código, se podría hacer así:
fuente
Otra opción:
fuente
fuente
Si necesita devolver un IHttpActionResult y desea devolver el código de error más un mensaje, use:
fuente
No me gusta tener que cambiar mi firma para usar el tipo HttpCreateResponse, por lo que se me ocurrió una pequeña solución extendida para ocultar eso.
Luego puede agregar un método a su ApiController (o mejor a su controlador base) como este:
Luego puede devolverlo como cualquiera de los métodos integrados:
fuente
Una actualización de @Aliostads responde usando el modo más moderno
IHttpActionResult
introducido en Web API 2.https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results#ihttpactionresult
fuente
Prueba esto :
fuente