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

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

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

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

Ответ 1

Вы можете использовать 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 указано выше для каждого действия, которое отключит кеширование сервера и браузера. Вы все равно можете переопределить этот кэш, добавив OutputCacheAttribute к определенным действиям и контроллерам.

Ответ 2

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

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

[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 для его обнаружения и принудительного обновления страниц или страниц.

Ответ 3

Мы можем установить профиль кэша в файле Web.config, а не устанавливать значения кеша индивидуально на страницах, чтобы избежать избыточного кода. Мы можем ссылаться на профиль, используя свойство 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");
}

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

Ответ 4

Если вы хотите предотвратить кеширование браузера, вы можете использовать этот код из 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);
}

Ответ 5

Для решения на странице Установите это на странице макета:

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

Ответ 6

Чтобы сделать мой ответ видимым для всех, я перемещаю свой комментарий, чтобы ответить на этот вопрос.

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

Это будет работать во всех браузерах (IE, Firefox и Chrome). Рад слышать, что мой ответ сработал для вас @Джозеф Кацман