2012-03-29 50 views
6

我有一些代碼在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物理緩存的內容在哪裏?

+0

以下支持文章你有沒有出賣了自己的問題?我有完全相同的問題。 – Chad 2014-07-16 16:20:32

+0

Nope沒有解決問題,重新設計了我的解決方案來解決問題。 – 2014-07-21 04:41:01

回答

0

我看不到緩存在IIS下無法工作的任何原因。緩存由WinINetProxy實現,並且與Internet Explorer使用的緩存相同。

嘗試設置最大年齡而不是過期時間。

+0

我正在設定最大年齡;已經更新了我上面的示例。 – 2012-04-01 23:12:15

相關問題