CacheOutput属性忽略Azure托管的Redis缓存

时间:2014-10-28 07:43:55

标签: caching azure asp.net-web-api outputcache stackexchange.redis

我刚刚使用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;返回的数据。

不会抛出任何错误。缓存似乎正在运行。然而,我总是调用昂贵的代码。

感谢您的帮助:)。

1 个答案:

答案 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框架从未报告过错误。它只是默默地失败并回到控制器方法。