OutputCache 忽略时间戳

OutputCache Ignore Timestamp

我在 MVC 中使用 OutputCache,但是当时间戳附加到 URL 时,我很难缓存。

特别是 jQuery 的 AJAX 组件将 _=21321423432 添加到 url.

的末尾

每次我调用操作的 URL 它总是会进入操作而不是返回缓存的项目。

我正在使用 VarByCustom 和 VarybyParam 元素根据登录用户以及开始和结束日期进行缓存。

动作

    [OutputCache(CacheProfile = "FeedCache")]
    public async Task<JsonResult> Feed(DateTime start, DateTime end)
    {
        //Do something

        return Json(result, JsonRequestBehavior.AllowGet);
    }

配置

<add name="FeedCache" duration="600" varyByParam="start;end" varyByCustom="user" location="Server" />

Global.asmx

public override string GetVaryByCustomString(HttpContext context, string custom)
{

    //
    // Vary by logged in user 
    //
    if (custom == "user")
    {

        return "user=" + context.User.Identity.Name;

    }

    return base.GetVaryByCustomString(context, custom);
}

我的印象是这会专门为用户缓存以及开始和结束参数,但事实并非如此。有什么我想念的吗?

jQuery's AJAX component appends a "_={timestamp}" only when you set cache option to false or for dataTypes 'script' and 'jsonp' 您可能 return 一个 JSON 对象数组,因此请尝试将 cache:true 添加到您的 ajax 选项中。它应该类似于:

$.ajax({
        type: ...,
        url: ...,        
        cache: true,
        success: function (data) {
        }
    });

如果我在属性中指定 OutputCache 详细信息而不是作为 webconfig 中的缓存配置文件,它就可以工作。

有效

[OutputCache(Duration = 600, Location = OutputCacheLocation.Server, VaryByParam = "start;end", VaryByCustom = "user")]

不起作用

[OutputCache(CacheProfile = "FeedCache")]

<add name="FeedCache" duration="600" varyByParam="start;end" varyByCustom="user" location="Server" />

我真的很想知道为什么他们有不同的行为...