2010-03-11 3 views
9

Я retreiving изображения из каталога веб-сервера, как это:Есть ли способ заставить WebClient, а не возвращать кэшированные данные?

 WebClient webClientImgDownloader = new WebClient(); 
     webClientImgDownloader.OpenReadCompleted += new OpenReadCompletedEventHandler(webClientImgDownloader_OpenReadCompleted); 
     if(uriIndex < uris.Count()) 
      webClientImgDownloader.OpenReadAsync(new Uri(uris[uriIndex], UriKind.Absolute)); 

Но я заметил, если удалить изображение, Silverlight продолжает получать изображение, как если бы он был там.

Когда я ввожу URL-адрес изображения в FireFox, я также вижу изображение, но затем я нажимаю Reload, и он дает мне соответствующую ошибку, что изображение не существует. Затем, когда я снова запускаю приложение silverlight, он также дает мне ошибку, что изображение не существует, как если бы браузер сбросил флаг кеша где-то.

Как я могу выполнить «обновление» через WebClient в коде, чтобы, если изображение внезапно не существует на сервере, Silverlight не продолжает выдавать мне кешированную копию?

+0

WebClient не возвращает кэшированные данные. Он возвращает данные, предоставляемые сервером и любыми прокси-серверами кэширования. Вам придется заставить сервер не отправлять вам данные, которые вы не хотите получать. –

+1

@John: На самом деле в этом случае я подозреваю, что никакой фактический запрос не существует вообще. WebClient будет использовать стек браузера, который будет поставлять контент из локального кеша, а не делать запрос на сервер. – AnthonyWJones

+0

@ Энтони: Я не знал, что многократно использовал стек браузера. У вас есть ссылка, чтобы сказать, что это сделано именно так? –

ответ

7

Это сложный вопрос, поскольку кеширование обычно вызвано заголовками веб-сайта, не указывающими отсутствие кеша. Я обнаружил, что в прошлом самый простой способ справиться с этими проблемами кеширования - просто предоставить рандомизированные параметры строки запроса, чтобы веб-сервер интерпретировал каждый запрос как новый запрос.

Если вы в настоящее время обращаетесь к www.domain.com/image.jpg, попробуйте www.domain.com/image.jpg?rand=XXXX, где XXXX - случайное значение, сгенерированное в коде на стороне сервера.

+1

Проблема с рандомизированной строкой запроса заключается в том, что она всегда будет принудительно загружать ресурс, потому что с точки зрения HTTP его другой ресурс он не может определить, что текущая кешированная версия является текущей версией uptodate и может быть повторно использована , Это может ухудшить производительность приложения. – AnthonyWJones

+0

+1 для рандомизированной идеи строки запроса, если производительность не является проблемой, как отмечено, это, казалось бы, заставляет ее всегда давать вам точный ответ, и вы можете сделать эту настройку так, чтобы во время разработки она включает в себя рандомизированную строку, затем, когда ваш сайт переходит в реальном времени, и данные установлены, вы можете удалить его для лучшей производительности. –

+0

Эдвард, это именно то, что я обычно делаю. Обычно я использую String.Format ("{0} {1}", url, (HttpContext.Current.IsDebuggingEnabled)? RandomParam: String.Empty). Я нашел, что это помогает мне обойти кеширование IIS не зарегистрированных ISAPI элементов, таких как js-файлы и т. Д. –

4

Вам нужно решить, какова ваша политика кэширования для различного контента на вашем сайте.

Если вы должны убедиться, что последнее состояние представлено, когда когда-либо был сделан запрос, убедитесь, что сервер правильно настроил заголовки ответов. В этом случае убедитесь, что у вас есть заголовок Cache-Control: max-age=0, указанный на изображении (или, скорее всего, в папке с набором изображений).

Установив max-age = 0, вы заставите браузер попытаться восстановить изображение, однако оно сообщит серверу о любой существующей версии изображения, имеющегося в кеше. Это дает серверу возможность отправить статус 404, потому что изображение было удалено, 304, потому что изображение все еще существует и не изменилось, поэтому может использоваться кэшированная версия или 200, потому что изображение изменилось, этот последний ответ будет иметь новая версия.

+0

Этот тип предполагает, что он контролирует сервер, на который он запрашивает. Я бы предположил, что, учитывая, что он использует веб-клиент для получения изображений, более вероятно, что он сбрасывает их с помощью WebClient именно потому, что они удалены/удалены от его контроля? –

+0

@Brian: Не означает, что он подражает, но он заявляет: «Я заметил, удалил ли я изображение», подразумевая, что он контролирует веб-сервер. – Evan

0

Вот мое решение:

return new BitmapImage(new Uri(Mang.Communication.ServicePathUrl + "Icon.aspx?location=" + value.imageParameter + "&originalSize=true" + "?" + System.DateTime.Now.ToString(), UriKind.Absolute)); 
Смежные вопросы