Я использовал класс / интерфейс провайдера кеша для обертывания IMemoryCache начиная с бета-версий Core 1.0, и недавно я обновился до 2.1, и теперь я заметил много проблем с кешированием (что, вероятно, является единственной частью, которая мне НУЖНАбыть экземпляром Singleton).
Я вызываю встроенную функцию .AddMemoryCache (), а затем внедряю свой поставщик кэша, и все мои службы используют этого поставщика кэша.Я заметил проблему при удалении информации о пользователе из кеша после выполнения второго шага в процессе регистрации ... .Remove будет вызываться успешно, но затем последующий вызов вернет информацию о пользователе из кеша безчтобы вызвать фабричный метод для увлажнения кэша.
В конце концов, я добавил свойство InstanceId в свой поставщик кэша (который должен быть Singleton), чтобы добавить его ко всем выводам отладки, которые мойкеш провайдер имеет.
public string InstanceId { get; } = Guid.NewGuid().ToString();
Как только я это сделал, я заметил, что InstanceId отличались в выходных данных отладки!
Кто-то также упоминал эту проблему здесь , но никогда не былоответ.
Дополнительная информация: Я выводю идентификаторы экземпляров (статический список) в конструкторе моего CacheProvider (который является Singleton), и я вижу различные идентификаторы в журнале:
... MemoryCacheProvider: Отладка: InstanceIds = 432cb4da-e958-46ba-8a1b-f98bc46a7beb ... MemoryCacheProvider: Отладка: InstanceIds = 432cb4da-e958-46ba-8a1b-f98bc46a7beb, 286305f-476 5 5 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 6 8 8 8 8 8 15 8 8 8 8 8 15 для1017 *
В противном случае я использую AddJwtBearer, который вызывает внедренный сервис, который также использует часть кэширования, а также UseRewrite и Use для маршрутизации (этоAngularJS SPA только с ядром MVC)
public static IApplicationBuilder UseLocalRewrite(this IApplicationBuilder app, bool forceHttps = true)
{
var options = new RewriteOptions()
.AddRedirectToHttpsPermanent()
;
return app
.UseRewriter(options)
.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
{
context.Request.Path = "/index.html";
await next();
}
})
;
}