web-dev-qa-db-fra.com

Définition des en-têtes de contrôle du cache HTTP dans l'API Web

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?

48
Moo

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;
}
71
Darrel Miller

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)
 {
    // ...
 }
94
Jacob

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

3
drzaus

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

2
mattferderer