Настройка заголовков управления кешем HTTP в Web API
Какой лучший способ установить заголовки управления кешем для общедоступных кеширующих серверов в WebAPI?
Мне не нужен элемент управления OutputCache на моем сервере, я ищу для управления кэшированием на стороне CDN и за ее пределами (у меня есть отдельные вызовы API, где ответ может быть неограниченно кэширован для данного URL-адреса), но все, В настоящее время мы читаем, что либо ссылаются на предварительные версии WebAPI (и таким образом ссылаются на вещи, которые, похоже, больше не существуют, например System.Web.HttpContext.Current.Reponse.Headers.CacheControl) или кажутся массово сложными для установки пары http заголовки.
Есть ли простой способ сделать это?
Ответы
Ответ 1
Заголовок управления кэшем может быть установлен следующим образом.
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
Как указано в комментариях, вы можете создать 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)
{
// ...
}
Ответ 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
Ответ 4
В случае, если кто-то приземляется здесь, ища ответ конкретно на ASP.NET Core, теперь вы можете сделать то, что предложил @Jacob, не набирая свой собственный фильтр. Core уже включает это:
[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800]
[public async Task<JsonResult> GetData()
{
}
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response