在Web API中设置HTTP缓存控制头

时间:2013-04-09 19:58:18

标签: c# asp.net-web-api http-caching

在WebAPI中为公共缓存服务器设置缓存控制标头的最佳方法是什么?

我对我的服务器上的OutputCache控件不感兴趣,我正在寻求控制CDN端及以后的缓存(我有单独的API调用,其中响应可以无限期地缓存给定的URL)但是我所做的一切到目前为止,我们已经阅读了WebAPI的预发布版本(因此引用了似乎不再存在的东西,比如System.Web.HttpContext.Current.Reponse.Headers.CacheControl),或者看起来很复杂,只是设置了几个http头。

有一种简单的方法吗?

4 个答案:

答案 0 :(得分:91)

根据评论中的建议,您可以创建ActionFilterAttribute。这是一个只处理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);
    }
}

然后您可以将它应用于您的方法:

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

答案 1 :(得分:70)

缓存控制标头可以像这样设置。

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

答案 2 :(得分:3)

与提出过滤器的this answer一样,请考虑“扩展”版本 - http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

过去它可以作为NuGet包Strathweb.CacheOutput.WebApi2使用,但是doesn't seem to be hosted anymore,而是在GitHub - https://github.com/filipw/AspNetWebApi-OutputCache

答案 3 :(得分:2)

如果有人在这里寻找专门针对ASP.NET Core的答案,您现在可以在不编写自己的过滤器的情况下执行@Jacob建议的操作。核心已经包含了这个:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800]
[public async Task<JsonResult> GetData()
{
}

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response