尽管在响应对象上配置了高速缓存控制标头,但它们仍未响应

时间:2015-07-23 10:58:16

标签: c# asp.net-web-api http-caching

我尝试在ASP.NET MVC Web API中设置缓存标头,但IIS的响应表明忽略了CacheControl值集。

我最初的假设是我在System.Web.Http.Cors中使用了EnableCorsAttribute,这在本用例中是必需的。但是,即使没有该属性,响应Cache-Control标头仍然是“私有”。

我在这里做错了吗?

    // GET api/<version>/content
    // [EnableCors(origins: "*", headers: "*", methods: "*")]
    public HttpResponseMessage Get(HttpRequestMessage request)
    {
        int cacheMaxAgeSeconds;

        string cacheMaxAgeString = request.GetQueryString("cache-max-age") ?? request.GetQueryString("cache-max-age-seconds");

        string rawUri = request.RequestUri.ToString();

        try
        {
            cacheMaxAgeSeconds = cacheMaxAgeString == null ? Config.ApiCacheControlMaxSeconds : int.Parse(cacheMaxAgeString);
        }
        catch (Exception ex)
        {
            cacheMaxAgeSeconds = Config.ApiCacheControlMaxSeconds;

            //... 
        }

        try
        {
            //...

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent("...", Encoding.UTF8, "application/json")
            };

            response.Headers.CacheControl = new CacheControlHeaderValue
            {
                Public = true,
                MaxAge = TimeSpan.FromSeconds(cacheMaxAgeSeconds)
            };

            return response;
        }
        catch (Exception apiEx)
        {
            //...
        }
    }

响应

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Date: Thu, 23 Jul 2015 10:53:17 GMT
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=knjh4pncbrhad30kjykvwxyz; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 2367
Connection: keep-alive

3 个答案:

答案 0 :(得分:6)

下面的代码在vanilla WebApi应用程序(System.Web.Http 4.0.0.0)中正确设置“cache-control:public,max-age = 15”。所以...可能不是导致问题的WebApi本身。

您的项目中可能有一些改变缓存设置的魔法(想想全局操作过滤器或类似的东西)。或者您可能正在通过代理重写HTTP标头。

if (ctype_digit($id) === true) {
    // Is integer
}

答案 1 :(得分:4)

答案是,几个星期后选择了这个:

运行 debug 版本时,

Cache-Control标头似乎设置为“private”。当我使用发布版本运行时,问题就消失了。

答案 2 :(得分:1)

添加可能导致此问题的另一件事:

你经历了一个Owin管道。

在这种情况下,您需要在Owin中间件中设置标头:

class MiddleWare : OwinMiddleware
{
    public MiddleWare(OwinMiddleware next)
    : base(next)
    {
    }
    public override async Task Invoke(IOwinContext context)
    {
        context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
        context.Response.Headers["Pragma"] = "no-cache";
        context.Response.Headers["Expires"] = "0";
        await Next.Invoke(context);
    }
}