2012-03-29 13 views
6

Mam pewien kod działający w ApiControllerze (ASP.Net Web API), który sam chce wysłać żądanie GET do innej usługi WWW. Usługa sieciowa (również część mojej aplikacji) zwraca nagłówki Cache-Control, wskazując czas wygaśnięcia treści, którą zwraca.Czy WebRequest.CachePolicy działa z kodu działającego w ramach IIS?

Używam nowy System.Net.Http.HttpClient, skonfigurowany z WebRequestHandler w celu wykorzystania buforowanie po stronie klienta (domyślnie HttpClientHandler nie obsługuje konfigurację pamięci podręcznej, choć nie korzysta System.Net.WebRequest jako jego realizacji HTTP bazowego):

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

na serwerze mam umożliwiającego buforowanie w moim działania kontrolera poprzez ...

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; 

powyższy (w skrócie) Kod działa poprawnie w teście; Wykonuję wiele połączeń do usługi w ten sposób i tylko pierwsze połączenie faktycznie nawiązuje kontakt z usługą (obserwowane za pośrednictwem komunikatów dziennika w usłudze w IIS); kolejne wywołania korzystają z pamięci podręcznej.

Jednakże, uruchamiając ten sam kod hostowany w IIS, wydaje się, że HttpClient ignoruje wynik buforowania (skonfigurowałem również mój kontener IoC tak, że w AppDomain istnieje tylko jedno wystąpienie HttpClient) i wywołuje usługę czas. To działa jako AppPoolIdentity. Interesujące jest to, że jeśli zmienię pulę aplikacji tak, aby działała jako usługa sieciowa, odpowiedź ma kod statusu 401 Nieautoryzowany (próbowałem ustawić Preauthenticate = true na WebRequestHandler, ale kod stanu nadal wynosi 401). To samo dotyczy sytuacji, gdy zmieniam pulę aplikacji, aby działała pod moimi własnymi danymi uwierzytelniającymi.

Czy jest coś na temat uruchamiania puli aplikacji w ramach tożsamości NetworkService i wirtualnej AppPoolIdentity, która uniemożliwia im korzystanie z buforowania po stronie klienta. Gdzie fizycznie istnieją treści buforowane przez WebRequest?

+0

Czy kiedykolwiek sprzedany problemu? Mam dokładnie ten sam problem. – Chad

+0

Nope nie rozwiązało problemu, przeorganizowałem moje rozwiązanie, aby go obejść. –

Odpowiedz

0

Nie widzę żadnego powodu, dla którego pamięć podręczna nie powinna działać w IIS. Pamięć podręczna jest zaimplementowana przez WinINetProxy i jest to ta sama pamięć podręczna, z której korzysta Internet Explorer.

Spróbuj ustawić maksymalny wiek zamiast czasu wygaśnięcia.

+0

Ustawiam maksymalny wiek; zaktualizowałem mój przykład powyżej. –