我有一些代碼在ApiController(ASP.Net Web API)中運行,它本身想要對另一個Web服務發出GET請求。 Web服務(也是我的應用程序的一部分)返回Cache-Control標題,指示它返回內容的到期時間。WebRequest.CachePolicy應該從在IIS內運行的代碼工作嗎?
我現在用的是新System.Net.Http.HttpClient
,具有WebRequestHandler
爲了使用客戶端緩存配置(默認HttpClientHandler
不支持高速緩存的配置,雖然它使用System.Net.WebRequest
作爲底層的HTTP實現):
var client = new HttpClient(new WebRequestHandler {
UseDefaultCredentials = true,
CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default)
});
var response = client.GetAsync("someUri").Result;
response.EnsureSuccessStatusCode();
在我通過我的控制器操作中啓用緩存服務器...
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.CacheControl = new CacheControlHeaderValue {
Public = true,
MaxAge = new TimeSpan(0, 5, 0); // Five minutes in this case
};
// Omitted, some content is added to the response
return response;
以上(略)代碼正常測試中;我以這種方式對服務進行多次調用,並且只有第一次調用實際上與服務聯繫(通過IIS中服務上的日誌消息觀察);隨後的調用使用緩存。
但是,運行IIS本身託管的相同代碼,看起來HttpClient
忽略了緩存結果(我還設置了IoC容器,使AppDomain中只存在HttpClient
的一個實例)並調用每個服務時間。這是作爲AppPoolIdentity運行的。有趣的是,如果我將應用池更改爲NetworkService運行,那麼響應的狀態碼爲401 Unauthorized(我試圖在WebRequestHandler
上設置Preauthenticate = true
,但狀態碼仍爲401)。如果我將應用程序池更改爲在我自己的憑據下運行,情況也是如此。
那麼,在NetworkService身份和虛擬AppPoolIdentity下運行App Pool會有什麼不便,它們會阻止它們使用客戶端緩存。無論如何,由WebRequest
物理緩存的內容在哪裏?
以下支持文章你有沒有出賣了自己的問題?我有完全相同的問題。 – Chad 2014-07-16 16:20:32
Nope沒有解決問題,重新設計了我的解決方案來解決問題。 – 2014-07-21 04:41:01