【发布时间】: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