Moo*_*Moo 49 c# http-caching asp.net-web-api
在WebAPI中为公共缓存服务器设置缓存控制头的最佳方法是什么?
我对我的服务器上的OutputCache控件不感兴趣,我正在寻求控制CDN方面的缓存(我有单独的API调用,其中响应可以无限期地缓存给定的URL)但是我读过的所有内容都是如此far或者引用WebAPI的预发布版本(因此引用似乎不再存在的东西,比如System.Web.HttpContext.Current.Reponse.Headers.CacheControl),或者看起来非常复杂,只需设置几个http头.
有一个简单的方法吗?
Jac*_*cob 95
如评论中所建议,您可以创建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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以将它应用到你的方法:
[CacheControl(MaxAge = 60)]
public string GetFoo(int id)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*ler 73
缓存控制头可以这样设置.
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;
}
Run Code Online (Sandbox Code Playgroud)
如果有人在这里寻找专门针对 ASP.NET Core 的答案,您现在可以执行 @Jacob 建议的操作,而无需编写自己的过滤器。核心已经包括这个:
[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800)]
public async Task<JsonResult> GetData()
{
}
Run Code Online (Sandbox Code Playgroud)
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response