Подтвердить что ты не робот

Настройка заголовков управления кешем HTTP в Web API

Какой лучший способ установить заголовки управления кешем для общедоступных кеширующих серверов в WebAPI?

Мне не нужен элемент управления OutputCache на моем сервере, я ищу для управления кэшированием на стороне CDN и за ее пределами (у меня есть отдельные вызовы API, где ответ может быть неограниченно кэширован для данного URL-адреса), но все, В настоящее время мы читаем, что либо ссылаются на предварительные версии WebAPI (и таким образом ссылаются на вещи, которые, похоже, больше не существуют, например System.Web.HttpContext.Current.Reponse.Headers.CacheControl) или кажутся массово сложными для установки пары http заголовки.

Есть ли простой способ сделать это?

4b9b3361

Ответ 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)
 {
    // ...
 }

Ответ 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