我编写了一个使用基于 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/