net data cache asp c# asp.net-web-api http-caching

c# - asp - web api cache data



Establecer encabezados de control de caché HTTP en la API web (4)

Como esta respuesta que sugiere filtros, considere la versión "extendida" - http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

Solía ​​estar disponible como un paquete Strathweb.CacheOutput.WebApi2 , pero parece que ya no está alojado , y está en GitHub - https://github.com/filipw/AspNetWebApi-OutputCache

¿Cuál es la mejor manera de establecer encabezados de control de caché para servidores públicos de caché en WebAPI?

No estoy interesado en el control OutputCache en mi servidor, estoy buscando controlar el almacenamiento en caché en el lado CDN y más allá (tengo llamadas API individuales donde la respuesta se puede almacenar en caché indefinidamente para la URL dada) pero todo lo que he leído Hasta ahora, cualquiera de las referencias de las versiones preliminares de WebAPI (y por lo tanto hace referencia a cosas que parecen no existir, como System.Web.HttpContext.Current.Reponse.Headers.CacheControl) o parece enormemente complicado para simplemente establecer un par de encabezados http.

¿Hay una manera simple de hacer esto?


Como se sugiere en los comentarios, puede crear un ActionFilterAttribute. Aquí hay uno simple que solo maneja la propiedad MaxAge:

public class CacheControlAttribute : System.Web.Http.Filters.ActionFilterAttribute { public int MaxAge { get; set; } public CacheControlAttribute() { MaxAge = 3600; } public override void OnActionExecuted(HttpActionExecutedContext context) { if (context.Response != null) context.Response.Headers.CacheControl = new CacheControlHeaderValue() { Public = true, MaxAge = TimeSpan.FromSeconds(MaxAge) }; base.OnActionExecuted(context); } }

Entonces puedes aplicarlo a tus métodos:

[CacheControl(MaxAge = 60)] public string GetFoo(int id) { // ... }


El encabezado de control de caché se puede configurar así.

public HttpResponseMessage GetFoo(int id) { var foo = _FooRepository.GetFoo(id); var response = Request.CreateResponse(HttpStatusCode.OK, foo); response.Headers.CacheControl = new CacheControlHeaderValue() { Public = true, MaxAge = new TimeSpan(1, 0, 0, 0) }; return response; }


En caso de que alguien llegue aquí buscando una respuesta específica para ASP.NET Core, ahora puede hacer lo que @Jacob le sugirió sin escribir su propio filtro. Core ya incluye esto:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800] [public async Task<JsonResult> GetData() { }

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response