Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 为什么我的会话值有时在.net核心mvc应用程序中丢失?_Asp.net Core_.net Core_Asp.net Core Mvc - Fatal编程技术网

Asp.net core 为什么我的会话值有时在.net核心mvc应用程序中丢失?

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

我在应用程序(asp.net核心mvc)的会话中陷入了一个深层次的问题。在我进入Asp.NETMVC之前,我从未遇到过这种问题

会话工作正常,当我在VisualStudio中使用断点检查会话值时,会话的每个值都被保留。但若我删除断点并只运行我的应用程序,那个么会话值将变为空/空,并且这个问题是间歇性的。我可以认为这是.NET核心MVC中的一个大缺陷/bug。 我查了几个答案,但没有一个对我有用

我在startup.cs中有这些设置

 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; }
}