首页 > 解决方案 > 将 ASP.NET Core 会话状态与多个应用程序实例一起使用

问题描述

最近,我一直在学习如何在 ASP.NET Core 中使用 Session State,当我的应用程序在单个实例上运行时它运行良好。

作为我的 Session 后备存储,我一直在使用Microsoft.Extensions.Caching.Cosmos包,并且一直在通过HttpContext.Session控制器或HttpContextAccessor中间件和/或自定义组件访问 Session。

我正在阅读有关 MSFT 的状态管理文章并遇到:

更好的方法是使用不需要粘性会话的 Redis 或 SQL Server 分布式缓存。有关详细信息,请参阅 ASP.NET Core 中的分布式缓存。

我看到我可以使用此处IDistributedCache显示的界面,但现在我很困惑。

我假设我之前的做法是只使用 1 个实例,因为我可能做错了?正如我所提到的,一旦我转到多个应用程序实例,应用程序就会中断。

我应该直接使用这个接口来获取缓存的功能吗?那么我的 Session 是如何与缓存相关联的呢?

这是我最初的做法:

if (string.IsNullOrEmpty(context.Session.GetString(SessionKeys.MyTestKey)))
{
    Redirect('/');
    return;
}

与我计划如何向前发展相比:

if (string.IsNullOrEmpty(cache.GetString(SessionKeys.MyTestKey)))
{
    Redirect('/');
    return;
}

标签: asp.netasp.net-coresession

解决方案


据我所知,会话将使用分布式缓存来存储数据。这意味着它可以将数据直接存储和获取到分布式缓存,如 redis,或者当您添加会话或获取会话时。

当你想在应用程序内部获取会话时,会话库会直接从分布式缓存中读取数据。

仅举一个例子,如果您读取会话,它可能会从 cookie 或服务器的内存中读取它。

对于多个实例,所有应用程序将从同一个分布式缓存中读取会话,这使您的会话运行良好。

因此,如果您为会话设置了分布式缓存和正确设置,它可以很好地适用于多实例环境。


推荐阅读