【发布时间】:2020-02-10 11:15:07
【问题描述】:
当我添加时
services.AddSession();
在我的核心 3.1 中我得到了启动
无法构造某些服务(验证服务描述符“ServiceType: Microsoft.AspNetCore.Session.ISessionStore Lifetime: Transient ImplementationType: Microsoft.AspNetCore.Session.DistributedSessionStore”时出错:无法解析“Microsoft”类型的服务.Extensions.Caching.Distributed.IDistributedCache' 同时尝试在堆栈上激活 'Microsoft.AspNetCore.Session.DistributedSessionStore'。):在 Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, ServiceProviderOptions options)
在 Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection 服务,ServiceProviderOptions 选项)
在 Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)
在 Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)
在 Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
在 Microsoft.Extensions.Hosting.HostBuilder.Build()
我从来没有像DistributedSessionStore那样,我只是添加了AddSession这一行,并没有添加任何nuget包,它从哪里获取这些数据?
当我转到services.AddSession() 上的定义时,它会带我去
Assembly Microsoft.AspNetCore.Session
对于这个错误是怎么回事感到非常惊讶。
【问题讨论】:
-
会话中间件需要
IDistributedCache实现。默认情况下,提供的实现是/应该是InMemoryDistributedCache,除非您将其替换为不同的东西,例如使用 Redis 进行分布式缓存,否则缓存不会在内存中(在您的应用程序中),而是将使用 redis。这允许以分布式方式轻松扩展会话。但不确定异常出现的位置或原因。 -
您可以尝试添加
AddMemoryCache。通常内存缓存应该作为AddMvC或AddControllersWithViews的一部分添加,但也许在您的conseltation 中没有。您是否使用没有任何剃须刀页面或视图的纯 WebAPI?如果是这样,使用会话是一个设计缺陷。 WebAPI 用于 RESTful 服务,这些服务是无状态的(因此没有会话,应为每个请求提供所需的一切)。如果您尝试通过 WebAPI/Restful API 运行会话,您稍后会遇到严重的麻烦 -
@Tseng 感谢 cmets,在所有条件相同的情况下,该错误非常具有误导性,因为我不知道谁在添加 DI 或谁在要求它。我想这是服务支持站点的地方,并且要使用相同的会话..不知道如果不打算共享它为什么还要使用分布式接口...
-
我告诉过你原因。它默认使用它,因为 Session 可以以分布式方式处理(即在运行应用程序的多个实例时)。默认情况下,MemoryDistributedCache 是 NOT 分发的。仅当未添加其他分布式缓存时才添加此缓存。如果将 Redis 添加为分布式缓存,则不会使用
MemoryDistributedCache。但它只发生在某些AddXxx电话上。对于其他人,您可能需要手动注册 -
对于您不必使用
AddMemoryCache()进行服务注册的情况(我怀疑您使用的是WebAPI,即使用services.AddControllers())。在这种情况下,您不应使用会话。 WebAPI/Restful API 应该是无状态的。会话是有状态的充分。
标签: asp.net-core asp.net-core-3.1