Setting HTTP cache control headers in Web API

后端 未结 4 632
执念已碎
执念已碎 2020-12-13 17:17

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

相关标签:
4条回答
  • 2020-12-13 17:35

    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;
    }
    
    0 讨论(0)
  • 2020-12-13 17:43

    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)
     {
        // ...
     }
    
    0 讨论(0)
  • 2020-12-13 17:56

    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

    0 讨论(0)
  • 2020-12-13 17:57

    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

    0 讨论(0)
提交回复
热议问题