我刚刚使用StrathWeb's library实现了我的Asp.Net Web API控制器的输出缓存,连接到StackExchange.Redis library连接到Azure托管的Redis缓存。
我编写了一个实现StrathWeb IApiOutputCache interface的自定义类,并调用了等效的StackExchange方法。这在Global.asax.cs中注册为缓存输出提供程序。
以下是一个使用示例:
public class MyApiController : ApiController
{
private const int FIFTEEN_MINUTES_IN_SECONDS = 900;
[CacheOutput(ClientTimeSpan = FIFTEEN_MINUTES_IN_SECONDS, ServerTimeSpan = FIFTEEN_MINUTES_IN_SECONDS)]
async public Task<Data> GetAsync(int param1, string param2)
{
return await GetExpensiveData();
}
[Serializable]
public class Data
{
// Members omitted for brevity
}
}
当调用api端点时,我可以看到框架正确调用了我的IApiOutputCache类上的所有必需方法:Contains,Set和Get。但是,即使找到并返回了缓存的副本,GetExpensiveData()方法也始终会运行并且“#39; fresh&#39;返回的数据。
不会抛出任何错误。缓存似乎正在运行。然而,我总是调用昂贵的代码。
感谢您的帮助:)。
答案 0 :(得分:1)
问题解决了。我错误地从我的IApiOutputCache类调用Redis。
之前...
public class AzureRedisApiOutputCache : IApiOutputCache
{
public object Get(string key)
{
return AzureRedisCache.Instance.GetDatabase().StringGet(key);
}
}
在...
public class AzureRedisApiOutputCache : IApiOutputCache
{
public object Get(string key)
{
// Call the extension method that also performs deserialization...
return AzureRedisCache.Instance.GetDatabase().Get(key);
}
}
public static class RedisDatabaseExtensions
{
public static object Get(this IDatabase cache, string key)
{
return Deserialize<object>(cache.StringGet(key));
}
}
这让我困惑了一段时间,因为CacheOutput框架从未报告过错误。它只是默默地失败并回到控制器方法。