【问题标题】:ASP.NET Core 3.1 services.AddSession(); causes crashASP.NET Core 3.1 services.AddSession();导致崩溃
【发布时间】: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。通常内存缓存应该作为AddMvCAddControllersWithViews 的一部分添加,但也许在您的conseltation 中没有。您是否使用没有任何剃须刀页面或视图的纯 WebAPI?如果是这样,使用会话是一个设计缺陷。 WebAPI 用于 RESTful 服务,这些服务是无状态的(因此没有会​​话,应为每个请求提供所需的一切)。如果您尝试通过 WebAPI/Restful API 运行会话,您稍后会遇到严重的麻烦
  • @Tseng 感谢 cmets,在所有条件相同的情况下,该错误非常具有误导性,因为我不知道谁在添加 DI 或谁在要求它。我想这是服务支持站点的地方,并且要使用相同的会话..不知道如果不打算共享它为什么还要使用分布式接口...
  • 我告诉过你原因。它默认使用它,因为 Session 可以以分布式方式处理(即在运行应用程序的多个实例时)。默认情况下,MemoryDistributedCacheNOT 分发的。仅当未添加其他分布式缓存时才添加此缓存。如果将 Redis 添加为分布式缓存,则不会使用 MemoryDistributedCache。但它只发生在某些AddXxx 电话上。对于其他人,您可能需要手动注册
  • 对于您不必使用AddMemoryCache() 进行服务注册的情况(我怀疑您使用的是WebAPI,即使用services.AddControllers())。在这种情况下,您不应使用会话。 WebAPI/Restful API 应该是无状态的。会话是有状态的充分

标签: asp.net-core asp.net-core-3.1


【解决方案1】:

我认为安全测试会话的唯一方法是使用如下代码:

if(HttpContext.Features.Get<ISessionFeature>()?.Session != null && HttpContext.Session.IsAvailable)
{
...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多