gpt4 book ai didi

c# - 带有 VaryByCustom 的 OutputCache 不起作用

转载 作者:太空狗 更新时间:2023-10-29 22:32:15 26 4
gpt4 key购买 nike

我正在尝试使用 OutputCache 属性在 ASP.NET MVC 4 中实现缓存。

这是我的 Controller Action :

[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”)。

如果我使用唯一的 myParam 参数调用操作,缓存会正常工作。

http://localhost:1592/MyController/MyAction?myParam=123 // called multiple times always read from cache

问题是,当我使用另一个参数调用操作时,未包含在 VaryByCustom 字符串中,无论如何都会调用 Controller 操作,如果应该缓存并且 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)]

因为默认情况下它的值为 "*"(全部)。

然后在您的 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,而不是 您提供的字符串

(我怀疑单独更改 [OutputCache] 就足够了,但也尝试更改方法)

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com