57

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

我对我的服务器上的 OutputCache 控件不感兴趣,我希望控制 CDN 端及其他地方的缓存(我有单独的 API 调用,其中可以无限期地缓存给定 URL 的响应)但是我读过的所有内容远不是引用 WebAPI 的预发布版本(因此引用似乎不再存在的东西,例如 System.Web.HttpContext.Current.Reponse.Headers.CacheControl),或者仅设置几个 http 标头似乎非常复杂。

有没有一种简单的方法可以做到这一点?

4

4 回答 4

102

正如评论中所建议的,您可以创建一个 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)
 {
    // ...
 }
于 2014-03-24T20:40:27.033 回答
81

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

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;
}
于 2013-04-10T01:33:13.663 回答
8

如果有人在这里寻找专门针对 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

于 2017-07-24T16:39:11.607 回答
3

这个建议过滤器的答案一样,考虑“扩展”版本——http: //www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

它曾经作为 NuGet 包提供Strathweb.CacheOutput.WebApi2,但似乎不再托管,而是在 GitHub 上 -- https://github.com/filipw/AspNetWebApi-OutputCache

于 2014-08-02T10:04:31.257 回答