Почему я не могу установить заголовок Cache-Control в Web API2 - PullRequest
0 голосов
/ 12 июня 2018

Чтобы воспроизвести проблему: с помощью Visual Studio 2015 создайте веб-приложение Asp.Net Framework с MVC и веб-API.Создайте Example контроллер API, как это:

using System.Web;
using System.Web.Http;
public class ExampleController : ApiController
{
    public IHttpActionResult Get()
    {
        HttpContext.Current.Response.AppendHeader("Cache-Control", "no-cache, no-store, must-validate");
        return Ok("foo");
    }
}

И все.Запустите приложение и проверьте инструменты разработчика в Chrome, а заголовок Cache-Control по-прежнему является просто значением по умолчанию:

Cache-Control is set to default value instead of what was specified in Web Api controller method

Если я изменю код вышена

HttpContext.Current.Response.AppendHeader("foobar", "no-cache, no-store, must-validate");

На самом деле он устанавливает заголовок:

It does add the foobar header

Я не могу найти ничего об этом в Google.Я попробовал подход атрибута фильтра действия для установки заголовков, и это, кажется, та же самая проблема.

Как переопределить заголовок Cache-Control по умолчанию в Asp.Net Web API?

Редактировать : я не уверен, что не так с вышеупомянутым, но еслиЯ заменяю фильтром действий, я могу заставить его работать, за исключением случаев, когда это метод синхронного контроллера:

using System;
using System.Web.Http.Filters;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
public class CacheControlAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        if (context.Response != null)
        {
            context.Response.Headers.CacheControl = new CacheControlHeaderValue()
            {
                NoStore = true,
                NoCache = true,
                MustRevalidate = true,
                MaxAge = new TimeSpan(0)
            };
        }
        base.OnActionExecuted(context);
    }
    public override async Task OnActionExecutedAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
    {
        if (context.Response != null)
        {
            context.Response.Headers.CacheControl = new CacheControlHeaderValue()
            {
                NoStore = true,
                NoCache = true,
                MustRevalidate = true,
                MaxAge = new TimeSpan(0)
            };
        }
        await base.OnActionExecutedAsync(context, cancellationToken);
    }
}

Это работает с синхронными действиями контроллера, но не async, как это

    [CacheControl]
    public async Task<IHttpActionResult> Get()
    {
        using(Model1 db=new Model1())
        {
            var result =await db.MyEntities.Where(n => n.Name == "foo").SingleOrDefaultAsync();
        return Ok(result);
        }
    }

Как мне заставить его работать с async?

...