簡體   English   中英

ASP.Net核心Sql會話持久性

[英]ASP.Net Core Sql Session Persistence

我編寫了一個使用基於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,則用戶將被踢出登錄屏幕。 有什么我想念的嗎? 我是否需要添加其他配置?

大衛先生,謝謝你

你在sql server上設置了ASPState嗎?

此鏈接可能有助於您設置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

這不起作用的原因是因為我必須在IIS中的應用程序池中啟用加載用戶配置文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM