如何“无效”部分ASP.NET MVC输出缓存?

时间:2009-08-17 15:00:22

标签: asp.net-mvc caching

有没有办法以编程方式使ASP.NET MVC输出缓存的部分无效?我希望能够做的是,如果用户发布的数据更改了从缓存操作返回的内容,则能够使缓存的数据无效。

这甚至可能吗?

2 个答案:

答案 0 :(得分:39)

一种方法是使用该方法:

HttpResponse.RemoveOutputCacheItem("/Home/About");

此处描述了另一种方式:http://aspalliance.com/668

我认为您可以通过为所需的每个操作使用方法级别属性来实现第二个方法,并且只需将表示键的字符串添加到其中。如果我理解你的问题就行了。

编辑:是的asp.net mvc OutputCache只是一个包装器。

如果您使用的是varyByParam="none",那么您只需使"/Statistics"无效 - 即如果<id1>/<id2>是查询字符串值。这将使页面的所有版本无效。

我做了一个快速测试,如果你添加varyByParam="id1",然后创建页面的多个版本 - 如果你说invalidate invalidate "/Statistics/id1",它将使该版本无效。但你应该做进一步的测试。

答案 1 :(得分:1)

我对缓存进行了一些测试。这是我发现的:

您必须清除导致您操作的每条路线的缓存。 如果您有3条路由导致控制器中的操作完全相同,则每条路径都有一个缓存。

让我们说,我有这条路线配置:

foreach ( $tbl_one_data as $row_ ) {
    $newArr = array();
    $newArr[] = ( int ) $row_ [0];
    $newArr[] = mysql_real_escape_string ( $row_ [1] );
    $newArr[] = mysql_real_escape_string ( $row_ [2] );
    $newArr[] = mysql_real_escape_string ( $row_ [3] );

    $arrayValues [] = $newArr;
}

然后,这3条路线通过参数routes.MapRoute( name: "config1", url: "c/{id}", defaults: new { controller = "myController", action = "myAction", id = UrlParameter.Optional } ); routes.MapRoute( name: "Defaultuser", url: "u/{user}/{controller}/{action}/{id}", defaults: new { controller = "Accueil", action = "Index", user = 0, id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Accueil", action = "Index", id = UrlParameter.Optional } ); 导致myAction myController

  1. http://example.com/c/myParam
  2. http://example.com/myController/myAction/myParam
  3. http://example.com/u/0/myController/myAction/myParam
  4. 如果我的行动如下

    myParam

    每个路由都有一个缓存(在本例中为3)。因此,我必须使每条路线无效。

    喜欢这个

    public class SiteController : ControllerCommon
        {
    
            [OutputCache(Duration = 86400, VaryByParam = "id")]
            public ActionResult Cabinet(string id)
            {
                 return View();
    }
    }