c# - must - cache-control html5
Los encabezados de Cache-Control no se envĂan en respuesta a pesar de estar configurados en el objeto de respuesta (3)
Estoy intentando establecer encabezados de caché en la API web de ASP.NET MVC, pero la respuesta de IIS sugiere que los valores de CacheControl se ignoran.
Mi suposición original era que estaba usando el atributo EnableCorsAttribute en System.Web.Http.Cors, que es necesario en este caso de uso. Sin embargo, incluso sin ese atributo, el encabezado 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-alive
El código a continuación establece "cache-control: public, max-age = 15" correctamente en la aplicación webApi de vainilla (System.Web.Http 4.0.0.0). Entonces ... probablemente no sea la propia WebApi la que causa el problema.
Es posible que tenga algo de magia en su proyecto que cambie la configuración de la caché (piense en los filtros de acción global o algo similar). O tal vez estás pasando por 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 unas semanas después:
El encabezado Cache-Control parece estar configurado como ''privado'' cuando se ejecutan versiones de depuración . El problema desaparece cuando corro con una versión de lanzamiento.
Para agregar otra cosa que puede causar esto:
Corres por un oleoducto de Owin.
En ese caso, necesita configurar los encabezados en un middleware de Owin definido como esto:
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);
}
}