gpt4 book ai didi

c# - 自定义 OutputCache 提供程序在 Add() 和 Set() 上生成不同的键

转载 作者:行者123 更新时间:2023-11-30 18:27:22 27 4
gpt4 key购买 nike

我正在 MVC3 中编写自定义 OutputCacheProvider。

调用按以下顺序触发:Get、Add、Set。我希望在所有方法中,生成的 key 都是相同的,但事实并非如此。问题在于,在不同的调用中,Get 和 Add 是使用与 Set 方法中不同的键调用的。

我的请求如下所示:http://localhost/testCall?startIndex=0&maxResults=25&testParam=4

设置 VaryByParam 后,根据我的查询参数,我希望 key 是唯一的,如下所示:testCall?startIndex=0&maxResults=25&testParam=4

相反,在 Get/Add 调用中, key 只有完整路径名:localhost/testCall

但是,在 Set 调用中, key 实际上看起来符合我的预期:local/testCallHQNmaxresultsV25NstartindexV0NtestparamV4FCDE

这是我的 Controller 方法。

[OutputCache(Duration = 15, VaryByParam = "*")]
public ActionResult TestOutputCache()
{
var obj = new List<string>() {"test", "one", "two", "three"};
return Json(obj);
}

这是我的自定义 OutputCacheProvider

public class MemcacheOutputCacheProvider : OutputCacheProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(name, config);
}

public override object Get(string key)
{
// UNEXPECTED, the key = "localhost/testCall"
return null;
}

public override object Add(string key, object entry, DateTime utcExpiry)
{
// UNEXPECTED, the key = "localhost/testCall"
return null;
}

public override void Set(string key, object entry, DateTime utcExpiry)
{
// EXPECTED, the key = "local/testCallHQNmaxresultsV25NstartindexV0NtestparamV4FCDE"
}

public override void Remove(string key)
{
}
}

如果 Set 调用是使用正确的参数进行的,但是 Get() 从未使用正确的键调用,那么缓存将只对/testCall 的根调用起作用

最佳答案

您执行 Set 方法的关键参数已编码,您应该对其进行解码。您可以使用 HttpUtility.UrlDecode 方法。

   public override object Add(string key, object entry, DateTime utcExpiry)
{
var decodedKey = HttpUtility.UrlDecode(key)
// implement your caching logic here
return entry;
}

Key 参数将始终与其他参数一起出现在 Set 方法中 - 这是正常的。

关于c# - 自定义 OutputCache 提供程序在 Add() 和 Set() 上生成不同的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26857053/

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