Ho un codice in esecuzione in un ApiController (API Web ASP.Net) che a sua volta desidera effettuare una richiesta GET a un altro servizio Web. Il servizio web (anche parte della mia app) restituisce intestazioni di Cache-Control che indicano un tempo di scadenza per il contenuto restituito.Se WebRequest.CachePolicy funziona con codice in esecuzione in IIS?
sto usando la nuova System.Net.Http.HttpClient
, configurato con un WebRequestHandler
Per utilizzare cache sul lato client (default HttpClientHandler
non supporta la configurazione della cache, anche se si fa uso System.Net.WebRequest
la sua applicazione HTTP sottostante):
var client = new HttpClient(new WebRequestHandler {
UseDefaultCredentials = true,
CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default)
});
var response = client.GetAsync("someUri").Result;
response.EnsureSuccessStatusCode();
Sul server che sto consentendo la memorizzazione nella cache all'interno della mia azione di controllo via ...
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;
il codice di cui sopra (abbreviato) funziona correttamente all'interno di un test; Effettuo più chiamate al servizio in questo modo e solo la prima chiamata contatta effettivamente il servizio (osservata tramite i messaggi di registro sul servizio in IIS); le chiamate successive utilizzano la cache.
Tuttavia, l'esecuzione dello stesso codice ospitato su IIS per sé, sembra che il HttpClient
ignora il risultato di caching (ho anche impostare il mio contenitore CIO tale che solo un'istanza del HttpClient
esiste nel dominio di applicazione) e chiama il servizio ogni tempo. Questo è in esecuzione come AppPoolIdentity. È interessante notare che se cambio il pool di app per funzionare come NetworkService, la risposta ha il codice di stato 401 Non autorizzato (ho provato a impostare Preauthenticate = true
su WebRequestHandler
ma il codice di stato è ancora 401). Lo stesso è vero se cambio il pool di app per funzionare con le mie credenziali.
Quindi, c'è qualcosa sull'esecuzione del pool di app sotto l'identità NetworkService e AppPoolIdentity virtuale, che impedisce loro di utilizzare il caching sul lato client. Dove si trova fisicamente il contenuto memorizzato da WebRequest
?
Hai mai venduto il tuo problema? Sto avendo lo stesso esatto problema. – Chad
No non ha risolto il problema, rearchitected la mia soluzione per aggirare il problema. –