Отключить кэширование на стороне клиента - PullRequest
14 голосов
/ 31 марта 2011

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

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

Я также читал кое-что о создании профилей для кэширования, но это также означало бы ссылаться на них в нескольких местах.Я бы хотел одну настройку в web.config или, может быть, в IIS?

Проект, над которым я работаю, содержит много частичных представлений

Заранее благодарю за любые советы в этомвопрос.

Ответы [ 5 ]

30 голосов
/ 16 мая 2012

Вы можете отключить кеширование браузера через Web.Config:

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Cache-Control" value="no-cache, no-store" />
                <add name="Pragma" value="no-cache" />
                <add name="Expires" value="-1" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

Источник: http://blog.jamesjones.name/2009/11/how-to-disable-browser-caching-in.html

Редактировать: добавлено no-store в Cache-Control для Chrome (http://code.google.com/p/chromium/issues/detail?id=28035)

Вы можете установить это на уровне проекта или на уровне подкаталога для управления кэшированием браузера по желанию. Например, на преимущественно динамическом сайте, управляемом данными, я могу установить эти заголовки на уровне проекта, но в каталоге / static (который содержит мои .js, .css, изображения) добавить другой файл web.config, который включает в себя соответствующую директиву </clear> и, возможно, вместо нее установите заголовок с далёким будущим.

4 голосов
/ 31 марта 2011

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


Обновление:

Вот что я имею:

// Here is my custom OutputCaheAttribute to prevent cache at all.
//Whatever you may put anything you want.
//Of course i don't use it here but i put it to show you how it's going.
[NoCache]
public class BaseController : Controller
{
    protected override ViewResult View(string viewName, string masterName, object model)
    {
        // I do some stuffs here to change MasterPage depending on current culture.
        // Don't care about it i just wanna show you why BaseController is good idea.
    }
}

Тогда ALL мои контроллеры наследуют от этого BaseController вместо обычного Controller.

Надеюсь, это было полезно ;)

0 голосов
/ 12 мая 2014

Попробуйте это

[OutputCache (NoStore = true, Duration = 0, VaryByParam = "None")]]

0 голосов
/ 02 апреля 2011

Атрибут OutputCache используется для кэширования выходных действий на стороне сервера.Чтобы отключить его, вы просто не применяете атрибут к действию / контроллеру.Если вы хотите отключить клиентскую сторону, то об этом позаботятся, добавив заголовок, информирующий браузер не кэшировать результат.

0 голосов
/ 31 марта 2011

Вы можете определить профили кэша в web.config, однако использование профилей кэша, похоже, не работает с атрибутом OutputCache в mvc 3. Прочтите этот вопрос: Кэширование ChildActions с использованием профилей кэша не будет работать?

...