2015-04-06 70 views
0

我有一個.Net 4.5.2 WebApi 2.2 REST服務。運行IIS 7.5的Windows 7機器。它沒有多大作用,但返回當前日期/時間。當在IIS中承載的,我得到的是這樣的響應頭:WebApi 2.2 IIS 7.5設置max-age

HTTP/1.1 200 OK 
Cache-Control: max-age=60 
Content-Length: 58 
Content-Type: application/json; charset=utf-8 
ETag: "c664145c-6923-44b6-b3fb-ff7e50259b44" 
Server: Microsoft-IIS/7.5 
ApplicationDate: Test with date 4/3/2015 3:18:08 PM 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Fri, 03 Apr 2015 19:18:10 GMT 

{"messages":[],"result":"All is well 4/3/2015 3:18:07 PM"} 

如果我把它稱爲第二次,我看到:

HTTP/1.1 200 OK 
Cache-Control: max-age=60 
Content-Length: 58 
Content-Type: application/json 
ETag: "c664145c-6923-44b6-b3fb-ff7e50259b44" 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Fri, 03 Apr 2015 19:27:25 GMT 

{"messages":[],"result":"All is well 4/3/2015 3:18:07 PM"} 

我的自定義頁眉(ApplicationDate)已經一去不復返了,時間沒有改變。關鍵可能是Cache-Control:max-age = 60。我不知道它來自哪裏!

如果我運行它「自我託管」,同樣的代碼...我看到這一點:

HTTP/1.1 200 OK 
Content-Length: 58 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-HTTPAPI/2.0 
ApplicationDate: Test with date 4/3/2015 3:35:31 PM 
Date: Fri, 03 Apr 2015 19:35:31 GMT 

{"messages":[],"result":"All is well 4/3/2015 3:35:30 PM"} 

東西在IIS管道設置最大年齡。 (順便說一句,用SoapUI和Fiddler測試,沒有瀏覽器問題,使事情變得複雜)

我已經嘗試禁用IIS OutputCache模塊。我驗證了使用FailedReqLogFiles:

OUTPUT_CACHE_LOOKUP_END 結果4 結果CACHING_DISABLED

當我改變緩存控制標頭中的代碼,我看到自託管版本的變化,但一些覆蓋頭在IIS版本回到最大年齡= 60。

HTTP/1.1 200 OK 
Cache-Control: max-age=60 
Pragma: no-cache 
Content-Length: 58 
Content-Type: application/json; charset=utf-8 
ETag: "3ce2e8b6-4891-496e-8bb7-087590239d6b" 
Server: Microsoft-IIS/7.5 
ApplicationDate: Test with date 4/3/2015 3:49:19 PM 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Fri, 03 Apr 2015 19:49:19 GMT 

{"messages":[],"result":"All is well 4/3/2015 3:49:19 PM"} 

這裏的控制器:

/// <summary> 
/// Get "REST" status 
/// </summary> 
/// <returns></returns> 
[ActionName("GetStatusDate")] 
[Route("GetStatusDate")] 
public HttpResponseMessage GetStatusDate() 
{ 
    CommonResponse<string> response = new CommonResponse<string>(); 
    response.Result = "All is well " + DateTime.Now; 
    HttpResponseMessage responseMessage = Request.CreateResponse(HttpStatusCode.OK, response); 

    responseMessage.Headers.Add("ApplicationDate", "Test with date " + DateTime.Now); 

    responseMessage.Headers.Remove("Cache-Control"); 

    responseMessage.Headers.CacheControl = new CacheControlHeaderValue() 
              { 
               MaxAge = TimeSpan.FromSeconds(11), 
               NoCache = true, 
               Private = true 
              }; 

    responseMessage.Headers.Add("Pragma","no-cache"); 

    return responseMessage; 

} 

什麼是設置最大年齡?

感謝,

肖恩

回答

0

所以,我應該張貼問題之前,等待一個小時....原來的問題是,CacheOutputAttribute(OutputCache.V2)不僅在具體設置資源,但已被添加到全局過濾器集合中。由於它繼承自FilterAttribute,IActionFilter,它作爲一個全局過濾器運行良好。這就是爲什麼所有的電話都被緩存了。它把這個項目扯到沒有找到問題。

肖恩

+0

所以,你做了什麼來做到這一點? – Coder 2017-01-18 07:00:36