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

时间:2014-11-11 03:36:17

标签: c# asp.net-mvc-3 outputcache

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

按此顺序触发调用:Get,Add,Set。我希望在所有方法中,生成的密钥都是相同的,但它们不是。问题是在不同的调用中使用与Set方法不同的键调用Get和Add。

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

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

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

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

这是我的控制器方法。

[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的根调用

2 个答案:

答案 0 :(得分:0)

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参数将始终与其他参数一起进入设置方法-这是正常的。

答案 1 :(得分:0)

OutputCacheProvider使用此处定义的CreateOutputCachedItemKey方法: https://github.com/microsoft/referencesource/blob/a7bd3242bd7732dec4aebb21fbc0f6de61c2545e/System.Web/OutputCacheModule.cs#L129

如果您仔细阅读了该方法的代码,则可以看到它是如何组装密钥的,它解释了密钥中多余的字母和查询字符串项。