我正在尝试使用outputcache属性在asp.net mvc 4中实现缓存。
这是我的控制器操作:

[HttpGet]
[OutputCache(Duration = CACHE_DURATION, VaryByCustom = "$LanguageCode;myParam", Location = OutputCacheLocation.Server)]
public JsonResult MyAction(string myParam)
{
    // this is called also if should be cached!
}

下面是global.asax中的getvarybycustomstring:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
    var pars = arg.Split(';');
    if (pars.Length == 0) return string.Empty;

    var res = new System.Text.StringBuilder();
    foreach (var s in pars)
    {
        switch (s)
        {
            case "$LanguageCode":
                var culture = CultureManager.GetCurrentCulture();
                res.Append(culture.Name);
                break;
            default:
                var par = context.Request[s];
                if (par != null)
                    res.AppendFormat(par);
                break;
        }
    }
    return base.GetVaryByCustomString(context, res.ToString());
}

始终调用此方法并返回正确的值(例如"it123")。
如果使用onlymyParam参数调用操作,则缓存工作正常。
http://localhost:1592/MyController/MyAction?myParam=123 // called multiple times always read from cache

问题是,当我用另一个参数(不包括在VaryByCustom字符串中)调用该操作时,无论如何都会调用控制器操作,也应该缓存if is,并且GetVaryByCustomString返回相同的结果。
http://localhost:1592/MyController/MyAction?myParam=123&dummy=asdf // called multiple times with different 'dummy' values always calls the action

知道吗?

最佳答案

首先,您必须将[OutputCache]更改为包含VaryByParam=""

[OutputCache(Duration = CACHE_DURATION, VaryByCustom = "$LanguageCode;myParam", VaryByParam = "", Location = OutputCacheLocation.Server)]

因为默认情况下,它的值是"*"(all)。
然后在GetVaryByCustomString()方法中,尝试返回生成的字符串,而不是调用基方法:
return res.ToString();

以下是base.GetVaryByCustomString()方法的源代码:
public virtual string GetVaryByCustomString(HttpContext context, string custom) {

        if (StringUtil.EqualsIgnoreCase(custom, "browser")) {
            return context.Request.Browser.Type;
        }

        return null;
    }

如您所见,它并不像您想象的那样,它只将浏览器类型与您提供的字符串进行比较,如果没有匹配,则返回null,而不是您提供的string
(我怀疑[OutputCache]更改本身就足够了,但也可以尝试更改方法)

关于c# - VaryByCustom的OutputCache不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22992661/

10-11 12:00