2012-03-29 13 views
6

Ich habe Code innerhalb eines ApiControllers (ASP.Net Web API) ausgeführt, der selbst eine GET-Anfrage an einen anderen Webdienst stellen möchte. Der Webdienst (ebenfalls Teil meiner App) gibt Cache-Control-Header zurück, die eine Ablaufzeit für den zurückgegebenen Inhalt angeben.Soll WebRequest.CachePolicy aus Code funktionieren, der in IIS ausgeführt wird?

I die neuen System.Net.Http.HttpClient verwenden, konfigurierte, um mit einem WebRequestHandler um clientseitige Zwischenspeicher zu verwenden (den Standard HttpClientHandler nicht Cache-Konfiguration unterstützt, obwohl es System.Net.WebRequest als zugrunde liegende HTTP-Implementierung zu verwenden ist):

var client = new HttpClient(new WebRequestHandler { 
    UseDefaultCredentials = true, 
    CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default) 
}); 
var response = client.GetAsync("someUri").Result; 
response.EnsureSuccessStatusCode(); 

auf dem Server, ich bin damit Caching in meiner Controller-Aktion über ...

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; 

der oben (abgekürzt) Code korrekt in einem Test funktioniert; Ich mache auf diese Weise mehrere Aufrufe an den Dienst und nur der erste Anruf kontaktiert tatsächlich den Dienst (beobachtet über Protokollnachrichten auf dem Dienst in IIS); Nachfolgende Aufrufe verwenden den Cache.

jedoch den gleichen Code auf IIS gehostet laufen selbst, so scheint es die HttpClient das Caching Ergebnis ignoriert und ruft den Service jeder (ich habe auch meine IoC-Container, so dass nur eine Instanz des HttpClient existiert in der AppDomain einrichten) Zeit. Dies wird als AppPoolIdentity ausgeführt.

Interessanterweise, wenn ich den App-Pool als NetworkService ausführen, dann hat die Antwort den Statuscode 401 Nicht autorisiert (Ich habe versucht Preauthenticate = true auf dem WebRequestHandler, aber der Statuscode ist immer noch 401). Dasselbe gilt, wenn ich den App-Pool so ändere, dass er unter meinen eigenen Anmeldeinformationen ausgeführt wird.

Gibt es also etwas über das Ausführen des App Pool unter der NetworkService-Identität und virtuelle AppPoolIdentity, die verhindert, dass sie clientseitige Zwischenspeicherung verwenden. Wo liegt der von WebRequest zwischengespeicherte Inhalt überhaupt?

+0

Haben Sie jemals Ihr Problem verkauft? Ich habe genau das gleiche Problem. – Chad

+0

Nein, hat das Problem nicht gelöst, hat meine Lösung neu formuliert, um es zu umgehen. –

Antwort

0

Ich sehe keinen Grund, warum der Cache nicht unter IIS arbeiten sollte. Der Cache wird von WinINetProxy implementiert und ist derselbe Cache, der von Internet Explorer verwendet wird.

Versuchen Sie, das Höchstalter anstelle der Ablaufzeit festzulegen.

+0

Ich stelle Max-Alter tatsächlich ein; habe mein Beispiel oben aktualisiert. –