Estoy tratando de establecer encabezados de caché en ASP.NET MVC Web API, pero la respuesta de IIS sugiere que se están ignorando los valores de CacheControl establecidos.
Mi suposición original era que estaba usando EnableCorsAttribute en System.Web.Http.Cors, que es necesario en este caso de uso. Sin embargo, incluso sin ese atributo, el encabezado de Cache-Control de respuesta sigue siendo 'privado'.
¿Hay algo que estoy haciendo mal aquí?
// GET api/<version>/content // [EnableCors(origins: "*", headers: "*", methods: "*")] public HttpResponseMessage Get(HttpRequestMessage request) { int cacheMaxAgeSeconds; string cacheMaxAgeString = request.GetQueryString("cache-max-age") ?? request.GetQueryString("cache-max-age-seconds"); string rawUri = request.RequestUri.ToString(); try { cacheMaxAgeSeconds = cacheMaxAgeString == null ? Config.ApiCacheControlMaxSeconds : int.Parse(cacheMaxAgeString); } catch (Exception ex) { cacheMaxAgeSeconds = Config.ApiCacheControlMaxSeconds; //... } try { //... var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("...", Encoding.UTF8, "application/json") }; response.Headers.CacheControl = new CacheControlHeaderValue { Public = true, MaxAge = TimeSpan.FromSeconds(cacheMaxAgeSeconds) }; return response; } catch (Exception apiEx) { //... } }Respuesta
HTTP/1.1 200 OK Cache-Control: private Content-Type: application/json; charset=utf-8 Date: Thu, 23 Jul 2015 10:53:17 GMT Server: Microsoft-IIS/7.5 Set-Cookie: ASP.NET_SessionId=knjh4pncbrhad30kjykvwxyz; path=/; HttpOnly X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Length: 2367 Connection: keep-aliveEl siguiente código establece "control de caché: público, edad máxima = 15" correctamente en la aplicación Vanilla WebApi (System.Web.Http 4.0.0.0). Entonces... probablemente no sea la propia WebApi la que cause el problema.
Es posible que tenga algo de magia en su proyecto que cambie la configuración de la memoria caché (piense en los filtros de acción globales o algo similar). O tal vez esté utilizando un proxy que reescribe los encabezados HTTP.
public HttpResponseMessage Get() { var content = new JavaScriptSerializer().Serialize(new { foo = "bar" }); var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content, Encoding.UTF8, "application/json") }; response.Headers.CacheControl = new CacheControlHeaderValue { Public = true, MaxAge = TimeSpan.FromSeconds(15) }; return response; } // returns in the response: "Cache-Control: public, max-age=15"La respuesta, habiendo recogido esto algunas semanas después:
El encabezado Cache-Control parece estar configurado como 'privado' cuando se ejecutan compilaciones de depuración . El problema desaparece cuando ejecuto una versión de lanzamiento.
Para agregar otra cosa que puede causar esto:
Corres a través de una canalización de Owin.
En ese caso, debe configurar los encabezados en un middleware de Owin definido así:
class MiddleWare : OwinMiddleware { public MiddleWare(OwinMiddleware next) : base(next) { } public override async Task Invoke(IOwinContext context) { context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate"; context.Response.Headers["Pragma"] = "no-cache"; context.Response.Headers["Expires"] = "0"; await Next.Invoke(context); } }