我想缓存操作中的返回数据。我为此使用OutPutCacheAttribute。这是我的客户代码:

$(document).ready(function() {
    $.get('@Url.Action("GetMenu", "Home")', null,
        function(data) {
            parseMenu(data);
    });
}

这是我的服务器代码:
[HttpGet]
[OutputCache(Duration = 86400, Location = OutputCacheLocation.Server)]
public ContentResult GetMenu()
{
    string jsonText = GetData(); //some code
    return new ContentResult
    {
        Content = jsonText,
        ContentType = "text/json"
    };
}

如您所见,我使用OutputCacheAttribute缓存服务器响应。但这是行不通的。每次加载页面时,都会调用Home/GetMenu操作。即使我直接在浏览器的地址栏中输入“localhost/Home/GetMenu”,它也会被调用。我在哪里弄错了?

UPD 我创建了第二项操作来测试该属性而无需调试。这是它的代码:
[HttpGet]
[OutputCache(Duration = 86400, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "none")]
public JsonResult GetJson()
{
    return Json(new
    {
        random = new Random().Next(100)
    },
    JsonRequestBehavior.AllowGet);
}

我以为如果OutputCache属性正常工作(并且我正确使用了它),那么操作将被调用一次,并且每次都会得到相同的响应。但是如果不是这样,我每次都会得到不同的响应,因为每次都会生成随机数。
当我几次调用此操作时,我总是收到不同的响应,例如{"random":36}{"random":84}

最佳答案

在其默认实现中,输出缓存是进程绑定(bind)的,并存储在内存中。结果,如果您执行诸如停止并启动调试之类的操作,则将破坏先前缓存的所有内容。实际上,更准确地说,您已经终止了该进程并启动了一个新进程,并且由于缓存是受进程限制的,因此它与旧进程一起消失了。

10-08 06:24