Quelle est la meilleure façon de définir les en-têtes de contrôle du cache pour les serveurs de mise en cache publics dans WebAPI?
Je ne suis pas intéressé par le contrôle OutputCache sur mon serveur, je cherche à contrôler la mise en cache côté CDN et au-delà (j'ai des appels API individuels où la réponse peut être mise en cache indéfiniment pour l'URL donnée) mais tout ce que j'ai lu ainsi soit fait référence à des versions préliminaires de WebAPI (et fait donc référence à des choses qui semblent ne plus exister, comme System.Web.HttpContext.Current.Reponse.Headers.CacheControl) ou semble massivement compliquée pour simplement définir quelques en-têtes http.
Existe-t-il un moyen simple de procéder?
L'en-tête de contrôle du cache peut être défini comme ceci.
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;
}
Comme suggéré dans les commentaires, vous pouvez créer un ActionFilterAttribute. Voici un simple qui ne gère que la propriété 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);
}
}
Ensuite, vous pouvez l'appliquer à vos méthodes:
[CacheControl(MaxAge = 60)]
public string GetFoo(int id)
{
// ...
}
Comme cette réponse suggérant des filtres, pensez à la version "étendue" - http://www.strathweb.com/2012/05/05/output-caching-in-asp-net-web -api /
Il était auparavant disponible sous forme de package NuGet Strathweb.CacheOutput.WebApi2
, mais ne semble plus être hébergé , et se trouve plutôt sur GitHub - https://github.com/filipw/AspNetWebApi-OutputCache
Si quelqu'un atterrit ici à la recherche d'une réponse spécifique à ASP.NET Core, vous pouvez désormais faire ce que @Jacob a suggéré sans écrire votre propre filtre. Core comprend déjà ceci:
[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800]
[public async Task<JsonResult> GetData()
{
}
https://docs.Microsoft.com/en-us/aspnet/core/performance/caching/response