使用自定义Redis输出缓存提供程序时MVCDonutCaching失败

时间:2019-05-30 14:01:04

标签: c# redis asp.net-mvc-5 outputcache donut-caching

我具有以下自定义Redis输出缓存:

public class CustomRedisOutputCache : RedisOutputCacheProvider
{
    public override object Add(string key, object entry, DateTime utcExpiry)
    {
        if (!HttpContextHelper.IsPreview())
        {
            return base.Add(key, entry, utcExpiry);
        }

        return entry;
    }

    public override void Set(string key, object entry, DateTime utcExpiry)
    {
        if (!HttpContextHelper.IsPreview())
        {
            base.Set(key, entry, utcExpiry);
        }
    }
}

在web.config中进行了设置:

<caching>
  <outputCache enableOutputCache="false" defaultProvider="CustomRedisOutputCache">
    <providers>
      <add name="CustomRedisOutputCache" type="xxx.xxx.Web.Caching.CustomRedisOutputCache" applicationName="xxx.xxx" connectionString="Redis" databaseId="4" throwOnError="false" retryTimeoutInMilliseconds="5000" loggingClassName="" loggingMethodName="" />
    </providers>
  </outputCache>

当我使用outputcache属性时,一切正常:

[OutputCache(CacheProfile = CacheProfile.Medium, VaryByParam = "*")]

但是,我正在尝试使用MVCDonutCaching Nuget Package并在将属性更改为

时实现DonutCaching。
[DonutOutputCache(CacheProfile = CacheProfile.Medium, VaryByParam = "*")]

失败,出现以下错误:

  

无法实例化和初始化类型为“ xxx.xxx.Web.Caching.CustomRedisOutputCache”的OutputCacheProvider。确保您指定了完整的类型名称。

根据documentation,我应该能够使用自定义缓存提供程序,那么有人知道这是什么问题吗?

查看源代码,这里似乎失败了:

            try
            {
                Instance = (OutputCacheProvider)Activator.CreateInstance(Type.GetType(providerSettings.Type));
                Instance.Initialize(providerSettings.Name, providerSettings.Parameters);

            }
            catch (Exception ex)
            {
                throw new ConfigurationErrorsException(
                    string.Format("Unable to instantiate and initialize OutputCacheProvider of type '{0}'. Make sure you are specifying the full type name.", providerSettings.Type),
                    ex
                );
            }

Full source for the above class

更新

下载并逐步查看源代码后,即使Type.GetType(providerSettings.Type)为xxx.xxx.Web.Caching.CustomRedisOutputCache并且正在执行的项目xxx中存在该类,看来providerSettings.Type仍返回null。 .xxx.Web

2 个答案:

答案 0 :(得分:0)

好吧,getType返回null的原因是因为nuget包是在.net4中完成的,而使用它的项目是.net4.6.1,因此nuget包无法获取类型,因为该类是不兼容的。有了源代码,我就可以在源代码解决方案中创建自定义redis提供程序,只需将我的项目和Web配置指向更新后的输出

答案 1 :(得分:0)

使用相同的MVC Donut Caching和RedisOutputCacheProvider软件包时,我遇到了相同的问题。我在MVC Donut Caching issue list上找到了解决方案。似乎我们只需要对所引用的类型更具体即可。

当我将配置类型引用更改为:

时,它对我有用

type="Microsoft.Web.Redis.RedisOutputCacheProvider, Microsoft.Web.RedisOutputCacheProvider"

希望这能帮助您消除项目中具有自定义版本或其他来源的需求。