Windows Phone. HttpWebRequest возвращает данные в response из кеша

21 Дек
2011

Разрабатывая приложение под Windows Phone я столкнулся с непонятной на первый взгляд проблемой. Вкратце, надо было вытягивать с помощью сервиса, которым тоже занимался я, некоторые поля из таблицы в локальной БД и разрешать удаление, тоже с помощью сервиса, если эти поля добавил этот же пользователь. В общем, ничего сложного, HttpWebRequest в помощь, вытягиваем все нужные данные, отображаем на странице в списке и добавляем кнопку Del напротив элементов которые можно удалить. Аналогично по нажатию кнопки посылаем запрос удаления поля из таблицы и если все удачно удаляем этот элемент из нашего отображаемого списка. Запускаю проверить, все чудесно работает кроме одного момента, если вернутся на предыдущую страницу и опять открыть страницу со списком, получаем полный список с удаленным элементом. Проверяю базу, в базе отсутствует. Идем пошагово в BeginGetResponse и действительно, получаем все элементы. Так как методы сервиса даже не срабатывают при повторном вызове, сразу понятно, что дело в кешировании запроса. Немного подумав и поискав решения этой проблемы, получил следующие выходы из ситуации:
  • Мы можем при инициализации нового запроса к строке с ссылкой дописывать уникальные параметры:
    var request = (HttpWebRequest)WebRequest.Create(requestUri + "&junk=" + DateTime.Now);
  • В нужном методе обработки запроса можно установить header Cahe-control в значение «no-cache»:
    public ResponseType GetData (string requestString)
    {
    	...
    	WebOperationContext.Current.OutgoingResponse.Headers.Add("Cache-Control", "no-cache");
    	...
    	return ...;
    }
  • Над методом сервиса установить атрибут [AspNetCacheProfile(«GetContent»)], а в файле web.config добавить следующий тег:
    <system.web>
    <caching>
         <outputCache enableOutputCache="true" />
         <outputCacheSettings>
            <outputCacheProfiles >
                <add name="GetContent" duration="0" noStore="true" location="Client" varyByParam="" enabled="true"/>
            </outputCacheProfiles>
        </outputCacheSettings>
    </caching>
    ...
    </system.web>
Хочется сказать, что кеширование это круто, но хотелось бы иметь более понятный способ его отключения на клиентской части в Windows Phone, например как в silverlight с помощью Client.CachePolicy. Разработчикам, которые пользуются внешними сервисами, придется пользоваться первым вариантом.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх