【发布时间】:2022-01-19 15:03:34
【问题描述】:
我想在 asp.net core 中自定义会话提供程序。即自定义会话提供程序将使用 MYSQL 数据库而不是 SQL Server 我看到 asp.net 核心为我们提供了内置方法 AddDistributedSqlServerCache。但似乎这种方法仅适用于 SQL Server。
谁能帮我解决这个问题?
【问题讨论】:
-
我对 PostgreSQL 也有同样的疑问
我想在 asp.net core 中自定义会话提供程序。即自定义会话提供程序将使用 MYSQL 数据库而不是 SQL Server 我看到 asp.net 核心为我们提供了内置方法 AddDistributedSqlServerCache。但似乎这种方法仅适用于 SQL Server。
谁能帮我解决这个问题?
【问题讨论】:
我在 .NET 5 或 .NET 6 中有以下工作实现(也适用于 .NET Core)
添加nuget包Pomelo.Extensions.Caching.MySql
在 Startup.cs 的 ConfigureServices 顶部
services.AddDistributedMySqlCache(options =>
{
options.ConnectionString = <MySQL CnStr with: Allow User Variables=true; >;
options.TableName = "WebUserSessions";
options.SchemaName = <MySQL Database Name>;
});
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(180);
options.Cookie.IsEssential = true;
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.Cookie.SameSite = SameSiteMode.Strict;
});
在配置方法app.UseSession();
My SQL 表创建脚本:
CREATE TABLE `webusersessions` (
`Id` varchar(449) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`AbsoluteExpiration` datetime(6) DEFAULT NULL,
`ExpiresAtTime` datetime(6) NOT NULL,
`SlidingExpirationInSeconds` bigint DEFAULT NULL,
`Value` longblob NOT NULL,
PRIMARY KEY (`Id`),
KEY `Index_ExpiresAtTime` (`ExpiresAtTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
现在您的会话值存储在 MySQL 表“WebUserSessions”中,因此您可以使用单个 mysql 数据库从多个服务器为您的客户端提供服务来存储会话。如果您只有一台服务器,您的用户会话将在 IIS 应用程序池重新启动或 Linux 服务重新启动时保留。
要在不停机的情况下更新 .NET core 或 .NET 6 应用程序,请参考我的回答:https://stackoverflow.com/a/66580629/9659885
【讨论】:
试试这个 NuGet 包吧....
Pomelo.Extensions.Caching.MySql
或者这个用于 Postgresql....
Community.Microsoft.Extensions.Caching.PostgreSQL
【讨论】: