Asp.net core 为什么我的会话值有时在.net核心mvc应用程序中丢失?
我在应用程序(asp.net核心mvc)的会话中陷入了一个深层次的问题。在我进入Asp.NETMVC之前,我从未遇到过这种问题 会话工作正常,当我在VisualStudio中使用断点检查会话值时,会话的每个值都被保留。但若我删除断点并只运行我的应用程序,那个么会话值将变为空/空,并且这个问题是间歇性的。我可以认为这是.NET核心MVC中的一个大缺陷/bug。 我查了几个答案,但没有一个对我有用 我在startup.cs中有这些设置Asp.net core 为什么我的会话值有时在.net核心mvc应用程序中丢失?,asp.net-core,.net-core,asp.net-core-mvc,Asp.net Core,.net Core,Asp.net Core Mvc,我在应用程序(asp.net核心mvc)的会话中陷入了一个深层次的问题。在我进入Asp.NETMVC之前,我从未遇到过这种问题 会话工作正常,当我在VisualStudio中使用断点检查会话值时,会话的每个值都被保留。但若我删除断点并只运行我的应用程序,那个么会话值将变为空/空,并且这个问题是间歇性的。我可以认为这是.NET核心MVC中的一个大缺陷/bug。 我查了几个答案,但没有一个对我有用 我在startup.cs中有这些设置 public void Configure(IApplicat
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromDays(1);
});
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
}).AddCookie("Cookies", options =>
{
// Configure the client application to use sliding sessions
options.SlidingExpiration = true;
// Expire the session of 15 minutes of inactivity
options.ExpireTimeSpan = TimeSpan.FromDays(1);
if (appSettings.RedisCachingEnabled)
{
options.EventsType = typeof(CustomCookieAuthenticationEvents);
}
options.Cookie.HttpOnly = true;
})
管理区/homeController.cs
public IActionResult LoadUsers() {
var users = _sessionData.users; // some users are lost when trying to get users from session
// some time its completely null. But if applied breakpoint, it shows correct session
}
这是我的课时课
public class SessionData : ISessionData
{
public IHttpContextAccessor _httpContextAccessor;
public SessionData(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public List<User> users
{
get
{
var users= _httpContextAccessor.HttpContext.Session.GetObjectFromJson<List<User>>("users");
if (users == null)
{
users = new List<User>();
}
return users;
}
set
{
_httpContextAccessor.HttpContext.Session.SetObjectAsJson("users", value);
}
}
}
公共类SessionData:ISessionData
{
公共IHttpContextAccessor\U httpContextAccessor;
公共会话数据(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
}
公共列表用户
{
得到
{
var users=_httpContextAccessor.HttpContext.Session.GetObjectFromJson(“用户”);
如果(用户==null)
{
用户=新列表();
}
返回用户;
}
设置
{
_httpContextAccessor.HttpContext.Session.SetObjectAsJson(“用户”,值);
}
}
}
您可以为IHttpContextAccessor创建自己的扩展方法,以保存json数据或在会话中检索json数据。
这里有一个例子
public static class Session
{
private static IHttpContextAccessor _httpContextAccessor;
private static ISession _session;
public static void Initialized(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_session = _httpContextAccessor.HttpContext.Session;
}
public static bool SetObject(this IHttpContextAccessor httpContextAccessor, string key, object value)
{
bool status = false;
try
{
Initialized(httpContextAccessor);
_session.SetString(key, JsonConvert.SerializeObject(value));
status = true;
}
catch (Exception ex)
{
}
return status;
}
public static T GetObject<T>(this IHttpContextAccessor httpContextAccessor, string key)
{
try
{
Initialized(httpContextAccessor);
var value = _session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
catch (Exception ex)
{
return default(T);
}
}
}
public static class Session
{
private static IHttpContextAccessor _httpContextAccessor;
private static ISession _session;
public static void Initialized(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_session = _httpContextAccessor.HttpContext.Session;
}
public static bool SetObject(this IHttpContextAccessor httpContextAccessor, string key, object value)
{
bool status = false;
try
{
Initialized(httpContextAccessor);
_session.SetString(key, JsonConvert.SerializeObject(value));
status = true;
}
catch (Exception ex)
{
}
return status;
}
public static T GetObject<T>(this IHttpContextAccessor httpContextAccessor, string key)
{
try
{
Initialized(httpContextAccessor);
var value = _session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
catch (Exception ex)
{
return default(T);
}
}
}
public class SessionController : Controller
{
private readonly UserInfo _user;
public SessionController (IHttpContextAccessor iHttpContextAccessor)
{
_user = iHttpContextAccessor.GetObject<UserInfo>("user");//get session with
//key user
}
public IActionResult Login(LoginModel User)
{
UserInfo userInfo = new UserInfo
{
Name = "name",
Id = 1
};
_iHttpContextAccessor.SetObject("user", userInfo);//set
//userinfo class into session
}
public class UserInfo
{
public string Name{ get; set; }
public int Id{ get; set; }
}