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
?
Czy kiedykolwiek sprzedany problemu? Mam dokładnie ten sam problem. – Chad
Nope nie rozwiązało problemu, przeorganizowałem moje rozwiązanie, aby go obejść. –