2015-03-17 18 views
0

У меня есть сжатый ресурс, который при просмотре в IE загружает из кэша, как ожидалось. Однако, когда мое приложение загружает один и тот же URL-адрес, Wininet игнорирует кеш и всегда загружает контент с сервера. С отключением динамического сжатия содержимого в IIS мое приложение ведет себя так же, как IE (HTTP GET включает заголовок If-None-Match.)Wininet не кэширует сжатый контент

Что делать, чтобы заставить приложение работать так же, как IE?

_httpClient = new HttpClient(new WebRequestHandler 
{ 
    CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default), 
    AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip 
}); 

using (Task<HttpResponseMessage> tget = _httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead, _cancel)) 
{ 
    tget.Wait(); 
    response = tget.Result; 
} 

HTTP-заголовки для ГЭТ моего приложения:

GET https://beautykiosktest.coinstar.com/conductor/configuration/files/Promos.xml?kioskid=ENG20130027 HTTP/1.1 
Accept: */* 
Accept-Language: en-US 
User-Agent: ConfigurationService/2.3.0.0 
Host: beautykiosktest.coinstar.com 
Accept-Encoding: gzip, deflate 

HTTP/1.1 200 OK 
Cache-Control: max-age=30 
Transfer-Encoding: chunked 
Content-Type: application/xml; charset=utf-8 
Content-Encoding: gzip 
ETag: "cHmrX5Fp2Z+ETV/qIXiS2A==" 
Vary: Accept-Encoding 
Server: Microsoft-IIS/8.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Tue, 17 Mar 2015 00:39:18 GMT 

GET в IE с 304 ответом является то, что я ожидал

GET https://beautykiosktest.coinstar.com/conductor/configuration/files/Promos.xml?kioskid=ENG20130027 HTTP/1.1 
Accept: image/jpeg, image/gif, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 
Accept-Language: en-US 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322) 
Accept-Encoding: gzip, deflate 
Host: beautykiosktest.coinstar.com 
If-None-Match: "cHmrX5Fp2Z+ETV/qIXiS2A==" 
DNT: 1 
Connection: Keep-Alive 

HTTP/1.1 304 Not Modified 
Cache-Control: max-age=30 
ETag: "cHmrX5Fp2Z+ETV/qIXiS2A==" 
Server: Microsoft-IIS/8.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Tue, 17 Mar 2015 00:42:13 GMT 

ответ

1

Я в конечном итоге подав билет с Microsoft, чтобы решить эту проблему и выяснили, что в .NET 4 есть ошибка, которая вызывает это. Проблема состоит в том, что запись в кеш, заполненная ответом с заголовком Vary, не соответствует правильному соответствию в следующем GET, потому что даже если установлено свойство AutomaticDecompression, .NET не добавил заголовок Accept-Encoding в запрос перед тем, как сделать тест кэша WinINET.

Обходной путь/исправление заключается в добавлении заголовка по умолчанию «Accept-Encoding» к экземпляру HttpClient перед его использованием.

_httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");