我正在尝试使用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"
)。如果使用only
myParam
参数调用操作,则缓存工作正常。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/