asp.net - 将 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;
}
解决方案
据我所知,会话将使用分布式缓存来存储数据。这意味着它可以将数据直接存储和获取到分布式缓存,如 redis,或者当您添加会话或获取会话时。
当你想在应用程序内部获取会话时,会话库会直接从分布式缓存中读取数据。
仅举一个例子,如果您读取会话,它可能会从 cookie 或服务器的内存中读取它。
对于多个实例,所有应用程序将从同一个分布式缓存中读取会话,这使您的会话运行良好。
因此,如果您为会话设置了分布式缓存和正确设置,它可以很好地适用于多实例环境。
推荐阅读
- node.js - 使用 @microsoft/microsoft-graph-client 创建订阅的请求无效
- python - 如何修复 csv 文件的 [nan] 输出?
- c# - 从EMGUCV C#中的图像中提取圆形区域
- git - 如何添加隐藏提交?
- python - 将命令行参数从文件传递给 pycharm
- ios - 将 LinkingObjects 视为列表
- java - 为什么 JpaRepository 的 delete 方法实际上并没有从数据库中删除元素?
- python - 条形图 - 使用 matplotlib 按列中的分类值进行计数和聚合
- python - 在 RandomForestRegressor sklearn 中绘制特征重要性
- php - 向 AJAX 请求添加第二个下拉列表以进行数据过滤