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 中持久化数据的初学者问题

ASP.NET Core on K8S深入学习数据管理

在 IIS 上托管的 ASP.NET Core WebApp 上提供持久配置

Hangfire在ASP.NET CORE中的简单实现