ASP.NET в MVC, как отключить автоматическое кэширование вариант?


Как отключить автоматическое кэширование браузера от asp.Net приложение mvc?

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

Так что кто-то знает, как вручную отключить опцию кэширования от ASP.NET MVC 4?

5   65   2012-10-18 10:11:10

5 ответов:

можно использовать OutputCacheAttribute для управления кэшированием сервера и/или браузера для определенных действий или всех действий в контроллере.

отключить для всех действий в контроллере

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration
public class MyController : Controller
{
  // ... 
}

отключить для конкретного действия:

public class MyController : Controller
{
    [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only
    public ActionResult Index()
    {
       return View();
    }
} 

если вы хотите применить стратегию кэширования по умолчанию ко всем действиям во всех контроллерах, вы можете добавить глобальные действия фильтра изменить global.asax.cs и ищем RegisterGlobalFilters метод. Этот метод добавляется в шаблон проекта приложения MVC по умолчанию.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new OutputCacheAttribute
                    {
                        VaryByParam = "*",
                        Duration = 0,
                        NoStore = true,
                    });
    // the rest of your global filters here
}

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

HackedByChinese не хватает точки. Он перепутал кэш сервера с кэшем клиента. OutputCacheAttribute управляет кэш сервера (IIS http.sys cache), а не кэш браузеров (клиентов).

Я даю вам очень небольшую часть моей кодовой базы. Используйте его с умом.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class NoCacheAttribute : FilterAttribute, IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(HttpCacheability.NoCache);
        cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
        cache.SetExpires(DateTime.Now.AddYears(-5));
        cache.AppendCacheExtension("private");
        cache.AppendCacheExtension("no-cache=Set-Cookie");
        cache.SetProxyMaxAge(TimeSpan.Zero);
    }
}

использование:

/// will be applied to all actions in MyController
[NoCache]
public class MyController : Controller
{
    // ... 
}

используйте его с умом, так как он действительно отключает весь кэш клиента. Единственный кэш не отключен-это кэш браузера "кнопка Назад". Но кажется, что на самом деле нет никакого способа обойти это. Возможно, только с помощью javascript для его обнаружения и принудительного обновления страниц или зон страниц.

мы можем установить профиль кэша в Интернете.конфигурационный файл вместо установки значений кэша по отдельности на страницах, чтобы избежать избыточного кода. Мы можем ссылаться на профиль с помощью свойства CacheProfile атрибута OutputCache. Этот профиль кэша будет применен ко всем страницам, если страница/метод не переопределит эти параметры.

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheProfile" duration="60" varyByParam="*" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

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

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult NoCachingRequired()
{
    return PartialView("abcd");
}

надеюсь, что это ясно и полезно для вас.

Если вы хотите предотвратить кэширование браузера, вы можете использовать этот код из ShareFunction

public override void OnResultExecuting(ResultExecutingContext filterContext)
{
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
}

для решения на странице, установите это на странице макета:

<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">