Изучая ASP.NET я недавно наткнулся на определенные трудности с кэшированием страниц на прокси серверах. Задавал даже вопрос на форуме. Спасибо 2 Mike Chaliy предложенное решение вполне работоспособно. Но я нашел еще кое что на эту тему. Причем все обнаруженные мной особенности никак не проявляли себя при тестировании на локальной машине и в локальной сети.
На своей домашней машине я установил IIS и разработал небольшое ASP.NET приложение для управления файлами на сервере и для отправки сообщений на сервер. Все работало замечательно на локальной машине во время отладки. И даже из локальной сети все тоже выглядело превосходно. На следующий день, воспользовавшись всеми прелестями ADSL от Укртелеком и DynamicDNS, я отправился в ХИРЭ "поуправлять" своей машиной удаленно. Выход в инет там организован через прокси, да еще и на кафедре стоит свой маленький прокси. С успехом загрузилась первая страничка, но потом все перестало работать, запросы до сервера не доходили а ответы грузились из кеша прокси, вобщем работать было невозможно. Нажимая сабмит я получал все ту же страничку. Псоле вопроса на форуме я вставил
Response.Cache.SetCacheability(HttpCacheability.NoCache);
во все веб-формы в обработчик Page_Load. Желаемый результат был достигнут. Мне показалась странной необходимость вставлять эту строчку. Почитав документацию по ASP.NET я нашел там такую вот директиву
<%@ OutputCache Duration="1" VaryByParam="None" %>
Размещаете ее на каждой странице и все работает нормально, Duration задается в секундах. Есть еще куча параметров по настройке кеширования. Кешировать, оказывается, можно на сервере, на прокси или клиенте и исключительно на клиенте. Причем директива применима как к странице целиком, так и к UserControl.
Порывшись в настройках IIS нашел там в разделе заголовков HTTP настройки срока действия содержимого и тут же установил настройку "истекает немедленно". Убрал все дополнительные настройки кэширования с веб-форм. Проверил все работает отлично, с одним только недостатком. Кнопочки на своей страничке я приукрасил повесив на них картинку и на onmouseover и onmouseout соответсвующие Java-скрипты меняющие картинку. Картинка естественно грузилась с моего сервера и при каждом срабатывании скрипта, а не при первом, кнопка становилась черной а потом загружалась соответствующая картинка, т.к. картинка подобно всему содержимому не кэшировалась браузером. Вобщем отвратительно выглядело. В итоге я решил вернутся к варианту №2 указав соответствующие директивы в каждой форме и изменив настройку IIS на однодневный срок действия содержимого. Этот вариант работал наиболее приемлемо.
Самое интересное что на локальной машине и в локальной сети ничего не кэшировалось вообще и все выглядело так, будто эти настройки не дают вообще никакого эффекта, хотя я и не протестировал все возможные параметры @OutputCache.
Приложение было очень простым и то вызывало недоумение первые несколько секунд, представляю что будет с более сложными если не позаботится о правильном кэшировании.