在Web API中设置HTTPcaching控制标头

在WebAPI中为公共caching服务器设置caching控制头的最好方法是什么?

我对我的服务器上的OutputCache控件不感兴趣,我正在寻找控制CDN方面的超速caching(我有单独的API调用,其中的响应可以无限期地caching给定的URL),但我读过的所有东西远或者引用WebAPI的预发布版本(并且因此引用似乎不再存在的东西,比如System.Web.HttpContext.Current.Reponse.Headers.CacheControl),或者对于设置几个http头文件而言似乎非常复杂。

有一个简单的方法来做到这一点?

caching控制头可以像这样设置。

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

正如评论中所build议的,你可以创build一个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) { // ... } 

像这个答案build议filter,考虑“扩展”版本 – http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

它曾经是一个NuGet包Strathweb.CacheOutput.WebApi2 ,但似乎不再被托pipe ,而是在GitHub上 – https://github.com/filipw/AspNetWebApi-OutputCache

如果有人在这里寻找专门针对ASP.NET Core的答案,现在可以做@Jacobbuild议的内容,而无需编写自己的filter。 核心已经包含这个:

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

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