2013-04-09 8 views
42

Qual è il modo migliore per impostare le intestazioni di controllo della cache per i server di caching pubblici in WebAPI?Impostazione delle intestazioni di controllo della cache HTTP nell'API Web

Non sono interessato al controllo OutputCache sul mio server, sto cercando di controllare il caching sul lato CDN e oltre (ho singole chiamate API in cui la risposta può essere memorizzata nella cache indefinitamente per l'URL specificato) ma tutto Ho letto fino ad ora o fa riferimento a versioni pre-release di WebAPI (e quindi fa riferimento a cose che sembrano non esistere più, come System.Web.HttpContext.Current.Reponse.Headers.CacheControl) o sembra enormemente complicato solo per l'impostazione di un paio di intestazioni http

C'è un modo semplice per farlo?

risposta

63

L'intestazione del controllo della cache può essere impostata in questo modo.

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; 
} 
+5

Quello è uno degli approcci che conosco circa, ma speravo in qualcosa che era meno invasiva e in particolare qualcosa che non si ha bisogno di rimuovere informazioni utili dal metodo dichiarazione (passare da uno specifico tipo di ritorno ad uno molto generico non è un buon cambiamento imho). Grazie comunque. – Moo

+3

@Moo potresti facilmente creare un ActionFilterAttribute che fa queste poche righe. Personalmente, utilizzo solo HttpResponseMessage come tipo di ritorno, quindi lo stile sopra riportato non è uguale a entrambi. HTTP è un'interfaccia generica, quindi riflettere sul mio livello API ha senso per me. –

+0

non è tanto che HTTP è un'interfaccia generica, è che il codice non è - qualunque cosa vada fuori dal filo, è comunque utile averlo nella dichiarazione del metodo piuttosto che sepolto nel codice :) l'approccio ActionFilterAttribute, grazie! – Moo

82

Come suggerito nei commenti, è possibile creare un ActionFilterAttribute. Ecco un semplice quella che gestisce solo la proprietà 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); 
    } 
} 

allora si può applicare ai vostri metodi:

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

Questa chace è solo per il lato client? Per la cache del server dovrei Strathweb.CacheOutput.WebApi2 impostando l'attributo su qualsiasi, giusto? –