【问题标题】:ASP.Net Core Sql Session PersistenceASP.Net Core Sql 会话持久化
【发布时间】: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,则用户将被踢出登录屏幕。 有什么我想念的吗?我需要添加一些其他配置吗?

提前致谢, 大卫

【问题讨论】:

  • 似乎是正确的。

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


【解决方案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 的应用程序池中启用加载用户配置文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2021-12-15
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多