2012-04-28 23 views
17

En la última versión beta de ASP.NET MVC4, ¿cómo apoyaría el soporte condicional de GET a través de ETags? El ActionFilter necesitaría poder completar la solicitud para generar el ETag para el recurso devuelto con el fin de compararlo con el encabezado If-None-Match en la solicitud. Y luego, independientemente de si la ETag entrante en el encabezado If-None-Match era la misma que la ETag generada, agregue la ETag generada al encabezado de respuesta ETag. Pero con ASP.NET MVC4, no tengo idea de dónde comenzar. ¿Alguna sugerencia?Implementación del soporte de ETag en ASP.NET MVC4 WebAPI

Respuesta

9

Hay un ETagMessageHandler en el WebApiContrib que hace lo que necesita.


ACTUALIZACIÓN

He implementado el almacenamiento en caché del lado del servidor RFC 2616 en WebApiContrib. Busque CachingHandler. Más información here.


más Actualizar

Esto se desarrolló y amplió bajo CacheCow activamente. Esto incluirá componentes de cliente y servidor. NuGet packages se publicará pronto se publican ahora.

WebApiContrib's CachingHandler se mantendrá así que cualquier error o problema, por favor avíseme.

16

Personalmente, no soy fanático de "framework magic" y prefiero el código simple en los métodos web, de lo contrario terminamos con algo más parecido a WCF, yuk.

Así, dentro de su método Get web, crear manualmente la respuesta de este modo:

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 producido a partir del código hash de la marca de tiempo es puramente ilustrativo de un sistema de etiquetado entidad débil. También muestra las comillas adicionales requeridas.

0

Parece que esto es lo que busca (véase la sección "Soporte para ETags"):

http://blogs.msdn.com/b/webdev/archive/2014/03/13/getting-started-with-asp-net-web-api-2-2-for-odata-v4-0.aspx

En caso de que su modelo se almacena más profundo en el dominio y no son capaces de aplicar la [ ConcurrencyCheck] atributo, puede hacer que el uso de la ODataModelBuilder:

ODataModelBuilder builder = new ODataConventionModelBuilder(); 
var myEntity = builder.EntitySet<MyEntity>("MyEntities"); 
myEntity.EntityType.Property(l => l.Version).ConcurrencyToken = true; 

esto hará que sea para agregar la propiedad "@ odata.etag" a un cuerpo de la respuesta.

4

respuesta de Lucas Puplett me consiguió en el camino correcto (1), pero tenga en cuenta que también hay que leer el ETag en el lado del servidor para evitar el envío de 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; 

Se También sería una buena idea respetar el encabezado If-Modified-Since. Ver RFC 2616.

Cuestiones relacionadas