c# - ASP.Net Core Sql session 持久化

标签 c# asp.net session asp.net-core

我编写了一个使用基于 SQL 的 session 存储的 ASP.Net Core 应用程序。 当我通过 visual studio 运行应用程序时, session 对象持续构建并启动/停止 IIS express,但是,当我将它部署到服务器(Win server 2012R2)时,应用程序池回收导致它丢失 session 状态。 - 编辑,实际上我的电脑重新启动,这显然结束了一个底层进程,导致我在 visual studio 中也失去了 session 。

我的配置服务:

        // 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 类围绕实际 session 对象进行工作:

    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 为空,则用户将被踢出到登录屏幕。 有什么我想念的吗?我需要添加一些其他配置吗?

提前致谢, 大卫

最佳答案

您是否在您的 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

关于c# - ASP.Net Core Sql session 持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41242532/

相关文章:

javascript - Telerik RadListBox 项目列表如何隐藏字符长度并显示工具提示?

asp.net - 远程连接到 WebDev.WebServer.exe

c# - 如何在 Powershell 中模拟 Active Directory 用户?

java - Multi-Tenancy Hibernate 实现中的 getCurrentSession

c# - 创建和删除文件夹时 MVC session 丢失

c# - 无法将匿名类型 #1[] 隐式转换为匿名类型 #2[]

c# - 为什么我只能从 BackgroundWorker 访问某些 UI 控件属性?

c# - 如何从 SelectedIndexChanged CodeBehind 中的 DropDownList 恢复值

asp.net - 跨域 session ,同一应用程序(ASP.NET)

PHP session导致varnish不缓存