What\'s the best way to set cache control headers for public caching servers in WebAPI?
I\'m not interested in OutputCache control on my server, I\'m looking to co
The cache control header can be set like this.
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;
}
As suggested in the comments, you can create an ActionFilterAttribute. Here's a simple one that only handles the MaxAge property:
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);
}
}
Then you can apply it to your methods:
[CacheControl(MaxAge = 60)]
public string GetFoo(int id)
{
// ...
}
In case anyone lands here looking for an answer specifically to ASP.NET Core, you can now do what @Jacob suggested without writing your own filter. Core already includes this:
[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800]
[public async Task<JsonResult> GetData()
{
}
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response
Like this answer suggesting filters, consider the "extended" version -- http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/
It used to be available as a NuGet package Strathweb.CacheOutput.WebApi2
, but doesn't seem to be hosted anymore, and is instead on GitHub -- https://github.com/filipw/AspNetWebApi-OutputCache