gpt4 book ai didi

asp.net-mvc - 为什么我不能在 Web API2 中设置 Cache-Control header

转载 作者:行者123 更新时间:2023-12-05 01:14:56 25 4
gpt4 key购买 nike

要重现该问题:使用 Visual Studio 2015,使用 MVC 和 Web API 创建一个 Asp.Net 框架 Web 应用程序。创建 Example api Controller 是这样的:

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 header 仍然只是它的默认值:

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

我在谷歌上找不到任何关于此的信息。我已经尝试使用操作过滤器属性方法来设置标题,它似乎是完全相同的问题。

如何覆盖 Asp.Net Web API 中的默认 Cache-Control header ?

编辑 :我不确定上面有什么问题,但是如果我用 Action 过滤器替换,我可以让它工作,除非它是同步 Controller 方法:
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);
}
}

这适用于同步 Controller Action ,但不适用于 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 一起使用?

最佳答案

我认为在您的操作方法中,您在设置缓存控制 header 后使用 OK("foo") 覆盖了 CacheControl header ,而您应该翻转代码并在之后设置缓存控制。
另外,在你的 Action 属性中

public override async Task OnActionExecutedAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
{
await base.OnActionExecutedAsync(context, cancellationToken);
if (context.Response != null)
{
context.Response.Headers.CacheControl = new CacheControlHeaderValue()
{
NoStore = true,
NoCache = true,
MustRevalidate = true,
MaxAge = new TimeSpan(0)
};
}
}

关于asp.net-mvc - 为什么我不能在 Web API2 中设置 Cache-Control header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50824257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com