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