У меня есть следующий пользовательский кэш вывода 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 = "*")]
Однако я пытаюсь реализовать DonutCaching с Nuget-пакет MVDonutCaching, и когда я меняю атрибут на
[DonutOutputCache(CacheProfile = CacheProfile.Medium, VaryByParam = "*")]
Он не работает со следующей ошибкой:
Unable to instantiate and initialize OutputCacheProvider of type 'xxx.xxx.Web.Caching.CustomRedisOutputCache'. Make sure you are specifying the full type name.
В соответствии с документация я должен иметь возможность использовать собственный поставщик кеша, так что кто-нибудь знает, в чем проблема?
Глядя на исходный код, кажется, здесь не работает:
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
);
}
Полный исходный код для вышеуказанного класса
Обновлять
После загрузки и просмотра исходного кода может показаться, что Type.GetType(providerSettings.Type)
возвращает значение null, хотя providerSettings.Type
— это xxx.xxx.Web.Caching.CustomRedisOutputCache, и этот класс существует в выполняющемся проекте xxx.xxx.Web.
Хорошо, причина, по которой getType
возвращал значение null, заключается в том, что пакет nuget выполнен в .net4, а проект, использующий его, был .net4.6.1, и поэтому пакет nuget не смог получить тип, поскольку класс был несовместим. Поскольку у меня был исходный код, я смог создать собственный провайдер Redis в исходном решении и просто указать свой проект и веб-конфигурацию на обновленный вывод.
У меня была та же проблема с использованием тех же пакетов MVC Donut Caching и RedisOutputCacheProvider. Я нашел решение на странице Список проблем кэширования пончиков MVC. Кажется, что нам просто нужно быть более конкретным в отношении типа, на который ссылаются.
Это сработало для меня, когда я изменил ссылку на тип конфигурации на:
type = "Microsoft.Web.Redis.RedisOutputCacheProvider, Microsoft.Web.RedisOutputCacheProvider"
Надеюсь, это поможет и избавит вас от необходимости иметь собственную сборку или чужой исходный код в вашем проекте.