在Web API中设置HTTP缓存控制头

Moo*_*Moo 49 c# http-caching asp.net-web-api

在WebAPI中为公共缓存服务器设置缓存控制头的最佳方法是什么?

我对我的服务器上的OutputCache控件不感兴趣,我正在寻求控制CDN方面的缓存(我有单独的API调用,其中响应可以无限期地缓存给定的URL)但是我读过的所有内容都是如此far或者引用WebAPI的预发布版本(因此引用似乎不再存在的东西,比如System.Web.HttpContext.Current.Reponse.Headers.CacheControl),或者看起来非常复杂,只需设置几个http头.

有一个简单的方法吗?

Jac*_*cob 95

如评论中所建议,您可以创建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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以将它应用到你的方法:

 [CacheControl(MaxAge = 60)]
 public string GetFoo(int id)
 {
    // ...
 }
Run Code Online (Sandbox Code Playgroud)


Dar*_*ler 73

缓存控制头可以这样设置.

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我所知道的方法之一,但我希望有一些侵入性较小的东西,特别是那些不需要你从方法声明中删除有用信息的东西(从特定的返回类型转换为非常通用的类型不是好的改变imho).无论如何,谢谢. (7认同)
  • @Moo你可以轻松创建一个执行这几行的ActionFilterAttribute.就个人而言,我只使用HttpResponseMessage作为我的返回类型,所以上面的风格不同我.HTTP是一个通用接口,因此反映在我的API层中对我有意义. (3认同)
  • @Moo如果你可以通过查看签名来告诉我看到了什么,我可能会同意.但是,你不知道电线是什么.它可能是JSON,它可能是对象的XMLSerializer序列化,它可能是对象的DataContractSerialization.你不知道,除非你知道所有已安装的格式化程序,它们的设置顺序,接受标题的样子,格式化程序的限制等等. (3认同)
  • 通过网络发出的只是党的一半,我必须编写和维护这些东西,并将其交给其他开发人员.隐藏在方法块中而不是在声明中返回的实际内容意味着文档必须始终100%定位,并且我们知道这样做有多好... (3认同)

mat*_*rer 6

如果有人在这里寻找专门针对 ASP.NET Core 的答案,您现在可以执行 @Jacob 建议的操作,而无需编写自己的过滤器。核心已经包括这个:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 1800)]
public async Task<JsonResult> GetData()
{
}
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response