Чтобы воспроизвести проблему: с помощью 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 по-прежнему является просто значением по умолчанию:
Если я изменю код вышена
HttpContext.Current.Response.AppendHeader("foobar", "no-cache, no-store, must-validate");
На самом деле он устанавливает заголовок:
Я не могу найти ничего об этом в 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
?