为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET MVC如何禁用自动缓存选项?

ASP.NET MVC如何禁用自动缓存选项?

慕田峪9158850 2019-11-27 11:06:13
如何从ASP.NET MVC应用程序禁用自动浏览器缓存?因为我在缓存时遇到问题,因为它缓存了所有链接。但是有时它会自动重定向到DEFAULT INDEX PAGE,并存储它的缓存,然后每次我单击该链接时,它都会将我重定向到DEFAULT INDEX PAGE。因此,有人知道如何从ASP.NET MVC 4中手动禁用缓存选项吗?
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您可以使用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();

    }

如果要对所有控制器中的所有操作应用默认缓存策略,则可以通过编辑并查找方法来添加全局操作过滤器。在默认的MVC应用程序项目模板中添加了此方法。global.asax.csRegisterGlobalFilters


public static void RegisterGlobalFilters(GlobalFilterCollection filters)

{

    filters.Add(new OutputCacheAttribute

                    {

                        VaryByParam = "*",

                        Duration = 0,

                        NoStore = true,

                    });

    // the rest of your global filters here

}

这将导致它对OutputCacheAttribute所有操作应用上面指定的操作,这将禁用服务器和浏览器缓存。您仍然可以通过添加OutputCacheAttribute到特定的操作和控制器来覆盖此无缓存。


查看完整回答
反对 回复 2019-11-27
?
弑天下

TA贡献1818条经验 获得超7个赞

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来检测它并强制页面或页面区域刷新。


查看完整回答
反对 回复 2019-11-27
?
翻阅古今

TA贡献1780条经验 获得超5个赞

我们可以在Web.config文件中设置缓存配置文件,而不是在页面中单独设置缓存值,以避免冗余代码。我们可以使用OutputCache属性的CacheProfile属性来引用配置文件。除非页面/方法覆盖这些设置,否则此缓存配置文件将应用于所有页面。


<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");

}

希望这很清楚,对您有用。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 876 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信