Можно ли использовать WebClient для извлечения файла из кэша браузера без проверки наличия более новой версии файла? - PullRequest
1 голос
/ 29 ноября 2010

Я использую экземпляр WebClient в своем приложении Silverlight для получения файла изображения для отображения.Для обслуживания этого приложения я настроил службу WCF REST.Ниже приведен фрагмент кода, который я написал для этой службы:

DateTime modSince = WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.IfModifiedSince] 
    == null 
    ? DateTime.MinValue 
    : DateTime.Parse(WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.IfModifiedSince].ToString());

FileInfo fInfo = new FileInfo(filePath);

if (fInfo.LastWriteTime > modSince)
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;
    WebOperationContext.Current.OutgoingResponse.LastModified = fInfo.LastWriteTime;
}
else
{
    WebOperationContext.Current.OutgoingResponse.SuppressEntityBody = true;
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotModified;
}

Служба настроена так, что при запросе файла изображения проверяется атрибут if-updated-Since заголовка запроса.,Если это значение меньше, чем при последнем изменении файла, файл возвращается.В противном случае возвращается сообщение 304.

Мы заинтересованы в том, чтобы сделать транзакцию быстрее.Поскольку изображения редко изменяются, если вообще когда-либо изменяются, желательно выполнить поиск в кэше копии изображения, прежде чем отправлять запрос на сервер, что сэкономит сетевую задержку.Пытаясь реализовать это для IE, я изменил настройки временных файлов Интернета на «никогда не проверять новые версии сохраненных страниц».Когда я ввожу в адресную строку браузера URL-адрес службы REST для изображения, копия которого хранится в кеше, копия извлекается из кеша без вызова сервера.Тем не менее, когда URL-адрес вводится в качестве параметра для метода OpenReadAsync WebClient, на сервер отправляется запрос GET, что приводит к сообщению 304.

Можно ли использовать WebClient для поиска в кэше?без запроса GET на сервер?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

Вам необходимо установить CahcePolicy на веб-клиент:

WebClient wc = new WebClient();
wc.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.CacheIfAvailable);

По умолчанию будет использоваться Microsoft.Win32.WinInetCache, который является менеджером кэша IE.


UPDATE

ОК, я не понял, что это SL. В этом случае, если изображение маленькое, я думаю, что проще все упростить, загрузив с сервера в любом случае. Если файл имеет большой размер, предоставьте метод для возврата даты его последнего изменения и внедрите локальное кэширование с использованием изолированного хранилища.

1 голос
/ 30 ноября 2010

Вы не можете запретить запрос кода в Silverlight. Параметр «никогда не проверять» в IE используется только при отсутствии директив управления кэшем с сервера, я бы не рекомендовал вам его использовать.

Я не уверен, почему вы используете WCF Rest для доставки изображений клиенту, а не просто помещаете изображения в папку на сервере и извлекаете их как стандартный статический контент?

В любом случае правильный подход к вашей проблеме заключается в том, чтобы сервер указал способ кэширования изображений, включив в ответ заголовок Cache-Control. Что-то вроде «Cache-Control: max-age = 86400».

...