Есть ли способ заставить WebClient, не возвращать кэшированные данные? - PullRequest
9 голосов
/ 11 марта 2010

Я получаю изображения из каталога веб-сервера следующим образом:

        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 не продолжал предоставлять мне его кэшированную копию?

Ответы [ 3 ]

7 голосов
/ 11 марта 2010

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

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

4 голосов
/ 11 марта 2010

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

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

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

0 голосов
/ 04 октября 2012

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

return new BitmapImage(new Uri(Mang.Communication.ServicePathUrl + "Icon.aspx?location=" + value.imageParameter + "&originalSize=true" +  "?" +  System.DateTime.Now.ToString(), UriKind.Absolute));
...