我试图在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
解决方法
以下代码在vanilla WebApi应用程序(System.Web.Http 4.0.0.0)中正确设置“cache-control:public,max-age = 15”.所以…它可能不是WebApi本身导致的问题.
您的项目中可能会有一些魔法改变缓存设置(想到全局动作过滤器或类似的东西).或者也许你正在通过代理重写HTTP头.
- public HttpResponseMessage Get()
- {
- var content = new JavaScriptSerializer().Serialize(new { foo = "bar" });
- var response = new HttpResponseMessage(HttpStatusCode.OK)
- {
- Content = new StringContent(content,"application/json")
- };
- response.Headers.CacheControl = new CacheControlHeaderValue
- {
- Public = true,MaxAge = TimeSpan.FromSeconds(15)
- };
- return response;
- }
- // returns in the response: "Cache-Control: public,max-age=15"