asp.net mvc 4 - mvc5 - Implementando el soporte de ETag en ASP.NET MVC4 WebAPI
web api frombody parameters (4)
La respuesta de Luke Puplett me llevó por el camino correcto (+1), pero tenga en cuenta que también debe leer la etiqueta ETag en el lado del servidor para evitar enviar todos los datos con cada solicitud:
string hash = obj.ModifiedDate.GetHashCode().ToString();
var etag = new EntityTagHeaderValue(String.Concat("/"", hash, "/""), true);
if (Request.Headers.IfNoneMatch.Any(h => h.Equals(etag)))
{
return new HttpResponseMessage(HttpStatusCode.NotModified);
}
var response = this.Request.CreateResponse(HttpStatusCode.OK, obj);
response.Headers.ETag = etag;
return response;
También sería una buena idea respetar el encabezado If-Modified-Since
. Ver RFC 2616 .
En la última versión beta de ASP.NET MVC4, ¿cómo apoyaría el soporte GET condicional a través de ETags? El ActionFilter tendría que poder completar la solicitud para generar el ETag para el recurso devuelto para poder comparar con el encabezado Si-Ninguno-Coincidencia en la solicitud. Y luego, independientemente de si el ETag entrante en el encabezado If-None-Match fue el mismo que el ETag generado, agregue el ETag generado al encabezado de respuesta ETag. Pero con ASP.NET MVC4, no tengo idea de por dónde empezar. ¿Alguna sugerencia?
Parece que esto es lo que está buscando (vea la sección "Soporte para ETags"):
En caso de que su modelo se almacene más en el dominio y no pueda aplicar el atributo [ConcurrencyCheck], puede hacerlo usando ODataModelBuilder:
ODataModelBuilder builder = new ODataConventionModelBuilder();
var myEntity = builder.EntitySet<MyEntity>("MyEntities");
myEntity.EntityType.Property(l => l.Version).ConcurrencyToken = true;
esto hará que se agregue la propiedad "@ odata.etag" a un cuerpo de respuesta.
Personalmente, no soy un fanático de "framework magic" y prefiero el código antiguo en los métodos web, de lo contrario terminamos con algo más parecido a WCF, yuk.
Entonces, dentro de tu método web Get, crea manualmente la respuesta de esta manera:
var response = this.Request.CreateResponse(HttpStatusCode.OK, obj);
string hash = obj.ModifiedDate.GetHashCode().ToString();
response.Headers.ETag =
new EntityTagHeaderValue(String.Concat("/"", hash, "/""), true);
return response;
Tenga en cuenta que la ETag producida a partir del código hash de la marca de tiempo es puramente ilustrativa de un sistema de etiquetado de entidad débil. También muestra las citas adicionales requeridas.
Hay un ETagMessageHandler en el WebApiContrib que hace lo que necesita.
ACTUALIZAR
He implementado el almacenamiento en caché del lado del servidor de RFC 2616 en WebApiContrib. Busque CachingHandler. Más información here .
Más actualización
Esto se desarrollará activamente y se ampliará en CacheCow . Esto incluirá componentes de cliente y servidor. Los paquetes de NuGet que se publicarán pronto se publican ahora.
El CachingHandler de WebApiContrib aún se mantendrá, por lo que cualquier error o problema, por favor hágamelo saber.