如何使用具有可变持续时间值的[OutputCache(Duration = 2000)]并重置服务器缓存

mga*_*e2m 5 c# asp.net-mvc outputcache output-caching asp.net-mvc-4

我有下面的代码,并希望Duration[OutputCache(Duration = 10)]行有一个变量的值,这样我可以从阅读DB或从List收藏.

而且我希望能够立即复位服务器缓存中,当Duration发生了变化.

如何在更改时更改Duration缓存HTML数据Duration?这是我的代码.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Cache_Example.Controllers
{
    public class HomeController : Controller
    {

        // GET: Home
       // [OutputCache(Duration = 10)]
        public ActionResult Index()
        {
            return View();
        }

        [OutputCache(Duration = 10)]
        public ActionResult ShowDate()
        {
            return PartialView();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*son 8

要更改持续时间,请按照以下步

如何在输出缓存中使用动态持续时间值? (请信用原作者)

我会从OutputCache属性继承并在那里设置Duration:

public static class CacheConfig
{
    public static int Duration = 36600;
}

public class MyOutputCacheAttribute : OutputCacheAttribute
{
    public MyOutputCacheAttribute()
    {
        this.Duration = CacheConfig.Duration;
    }
}

[MyOutputCache(VaryByParam = "none")]
public ActionResult Index()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以通过Duration动态和全局改变CacheConfig.Duration

如果需要,您仍然可以覆盖每个操作的全局设置:

[MyOutputCache(Duration = 100, VaryByParam = "none")]
public ActionResult OtherAction()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

然后,当Duration自己更改时,您可以立即重置服务器缓存.这是如何做:

"ASP.NET缓存对象位于System.Web命名空间中,并且因为它是通用缓存实现,所以它可以在任何引用此命名空间的应用程序中使用.

System.Web.Caching.Cache类是对象的缓存.可以通过静态属性System.Web.HttpRuntime.Cache或通过辅助实例属性System.Web.UI.Page和System.Web.HttpContext.Cache访问它.因此,它可以在请求的上下文之外使用.整个应用程序域中只有一个此对象的实例,因此HttpRuntime.Cache对象可以存在于Aspnet_wp.exe之外的每个应用程序域中.

以下代码显示了如何从通用应用程序访问ASP.NET缓存对象.

HttpRuntime httpRT = new HttpRuntime();
Cache cache = HttpRuntime.Cache;
Run Code Online (Sandbox Code Playgroud)

在访问当前请求的缓存对象后,您可以按常规方式使用其成员."

REF:过时的MSDN源:.NET Framework应用程序的缓存体系结构指南

注意:使用.Net 3.5,您只能使用InProc缓存,使用.NET 4,您可以在进程外部存储缓存以及使用自定义CacheProviders.

我想强调一点,如果缓存应该比AppPool循环使用的时间更长(例如每天),那么你需要缓存Out-Of-Process.


还要检查它是否在服务器上缓存:http: //msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation.aspx

  • 除非我遗漏了什么,否则这不是 OP 想要的。这只是为缓存设置全局默认值,但不能动态更改。CacheConfig.Duration 将复制到 MyOutputCacheAttribute 的每个实例中,更新不会生效。 (2认同)