2012-03-29 10 views
6

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?

+0

Hai mai venduto il tuo problema? Sto avendo lo stesso esatto problema. – Chad

+0

No non ha risolto il problema, rearchitected la mia soluzione per aggirare il problema. –

risposta

0

Non vedo alcun motivo per cui la cache non dovrebbe funzionare in IIS. La cache è implementata da WinINetProxy ed è la stessa cache utilizzata da Internet Explorer.

Provare a impostare il limite massimo invece del tempo di scadenza.

+0

Attualmente sto impostando max-age; ho aggiornato il mio esempio sopra. –

Problemi correlati