ASP.Net Core Sql 会话持久化
Posted
技术标签:
【中文标题】ASP.Net Core Sql 会话持久化【英文标题】:ASP.Net Core Sql Session Persistence 【发布时间】:2017-05-05 16:22:01 【问题描述】:我编写了一个使用基于 SQL 的会话存储的 ASP.Net Core 应用程序。 当我通过 Visual Studio 运行应用程序时,会话对象会持续构建并启动/停止 IIS Express,但是,当我将其部署到服务器(Win server 2012R2)时,应用程序池回收会导致它丢失会话状态。 - 编辑,实际上是我的计算机重新启动,这显然结束了一个底层进程,导致我也失去了在 Visual Studio 中的会话。
我的配置服务:
// Serializer settings have been changed so that the JSON response sends the same case, not lower case first letter as default
services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
// Builder to access the config
var builder = new ConfigurationBuilder();
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddJsonFile("appsettings.json");
var config = builder.Build();
// Get and configure the session timeout
int SessionTimeout = Convert.ToInt32(config["AppSettings:SessionTimeout"]);
services.AddSession(s =>
s.IdleTimeout = TimeSpan.FromMinutes(SessionTimeout);
);
// Get the session state datebase location
var AspStateConnectionString = config["AppSettings:ConnectionStrings:ASPStateConnectionString"];
services.AddDistributedSqlServerCache(o =>
o.ConnectionString = AspStateConnectionString;
o.SchemaName = "dbo";
o.TableName = "Sessions";
);
我的配置:
// Configure to use session
app.UseSession();
// Pass context to CoreSessionManager class and ContextPerRequest
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
CoreSessionManager.Configure(httpContextAccessor);
CoreLibrary.ContextPerRequest.Configure(httpContextAccessor);
// Configure the routes - defaults to login page.
app.UseMvc(routes =>
routes.MapRoute(
name: "default",
template: "controller=Account/action=Login");
);
CoreSessionManager 类围绕实际会话对象进行工作:
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
HttpContextAccessor = httpContextAccessor;
public static UserDetail UserDetail
get
if (HttpContextAccessor.HttpContext.Session.Get("UserDetail") != null)
return JsonConvert.DeserializeObject<UserDetail>(HttpContextAccessor.HttpContext.Session.GetString("UserDetail"));
return null;
set
HttpContextAccessor.HttpContext.Session.SetString("UserDetail", JsonConvert.SerializeObject(value));
如果此 UserDetails 为 null,则用户将被踢出登录屏幕。 有什么我想念的吗?我需要添加一些其他配置吗?
提前致谢, 大卫
【问题讨论】:
似乎是正确的。 【参考方案1】:您是否在 sql server 上设置了 ASPState?
This link 可能会帮助您设置 ASPState。
或按以下步骤操作:
打开命令提示符并找到以下路径:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 基于您的操作系统版本和 .NET 版本 使用以下语句:
使用默认 ASPState 数据库和 SQL 安全性时,键入以下命令:
aspnet_regsql -S serverName -U UserName -P Password -ssadd -sstype p
使用默认的 ASPState 数据库和 windows 安全,键入以下命令:
aspnet_regsql -S serverName -E -ssadd -sstype p
使用自定义数据库和 SQL 安全性,键入以下命令:
aspnet_regsql -d TableName -S serverName -U UserName -P Password -ssadd -sstype c
【讨论】:
我做到了。我根据此链接直接运行 SQL 命令:[link(]mikesdotnetting.com/article/292/…) 我可以看到条目正在填充,当我更改登录字符串时,会话不会创建。 另外,我可能错了,但我相信这是为了创建旧版本的 ASPState 表。它在 ASP.Net Core 中具有不同的结构。【参考方案2】:这不起作用的原因是我必须在 IIS 的应用程序池中启用加载用户配置文件。
【讨论】:
以上是关于ASP.Net Core Sql 会话持久化的主要内容,如果未能解决你的问题,请参考以下文章
2021-07-01 .NET高级班 81-ASP.NET Core RabbitMQ的消息持久化
如何在 Web API Asp.NET Core 5 中持久化常用数据?
关于在 ASP.NET Core 和 Docker 中持久化数据的初学者问题