Сессия ASP.NET Core заканчивается слишком рано - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть веб-приложение ASP.NET Core, которое использует сессию для хранения некоторых переменных. Все отлично работает локально в любом сценарии, но по какой-то причине я не могу получить значения из сеанса в какой-то момент (они нулевые) на компьютере Azure.

Сценарий:

  1. Выполнение входа в систему, которая перенаправляет на другой контроллер (сохранение пользовательских данных в сеансе)
  2. Ввести некоторые необходимые данные, а затем перенаправить на другой контроллер (также сохранить некоторые данные в сеансе и получить другие значения)
  3. На странице «Указатель» укажите дополнительные данные для сеанса. Представление этого контроллера вызывает функцию JavaScript, которая вызывает " OnScrollEnd ", который является методом, реализованным этим контроллером.
  4. Когда пользователь прокручивает страницу вниз, вызывается та же самая функция javascript (которая вызывает OnScrollEnd )
  5. Этот метод пытается получить данные из сеанса, но теперь он нулевой.

(приведенный выше сценарий демонстрирует, что по существу состояние сеанса работает, но в какой-то момент не удается получить значения)

Вход:

2019-04-23 14: 12: 34,220 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [(null)] <(null)> - Авторизация прошла успешно. 2019-04-23 14: 12: 34,220 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [(null)] <(null)> - Авторизация прошла успешно. 2019-04-23 14: 12: 34,220 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)] <(null)> - выполнение метода действия MyWebService.Controllers.AllCardsController.OnScrollEnd (MyWebService) - Состояние проверки: действительно 2019-04-23 14: 12: 34,220 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)] <(null)> - выполнение метода действия MyWebService.Controllers.AllCardsController.OnScrollEnd (MyWebService) - Состояние проверки: действительно 2019-04-23 14: 12: 34,220 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Session.DistributedSession [(null)] <(null)> - Доступ к истекшему сеансу, ключ: c691acb5-f9ed-5a71-6ebb-f3a0980c4efd 2019-04-23 14: 12: 34,220 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Session.DistributedSession [(null)] <(null)> - Доступ к истекшему сеансу, ключ: c691acb5-f9ed-5a71-6ebb-f3a0980c4efd 2019-04-23 14: 12: 34,221 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)] <(null)> - выполненное действие MyWebService.Controllers.AllCardsController.OnScrollEnd (MyWebService) в 0,7545мс 2019-04-23 14: 12: 34,221 [29] ИНФОРМАЦИЯ Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)] <(null)> - выполненное действие MyWebService.Controllers.AllCardsController.OnScrollEnd (MyWebService) в 0,7545мс 2019-04-23 14: 12: 34,223 [29] ОШИБКА Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [(null)] <(null)> - Произошло необработанное исключение при выполнении запрос.

(Исключение возникает из-за того, что значение, выбранное из сеанса, было нулевым)

Начальная конфигурация:

        public void ConfigureServices(IServiceCollection services)
        {
            var expiredSessionHours = Configuration.GetValue<int>("SessionExpireHours");
            var expiredSessionMinutes = Configuration.GetValue<int>("SessionExpireMinutes");

            services.AddLocalization(options => options.ResourcesPath = "Resources");

            services.AddAuthentication(options =>
            {
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
            .AddCookie(options =>
            {
                options.LoginPath = "/Login";
                options.ExpireTimeSpan = new TimeSpan(expiredSessionHours, expiredSessionMinutes, 0);
                options.SlidingExpiration = true;
                options.Cookie.Expiration = new TimeSpan(expiredSessionHours, expiredSessionMinutes, 0);
            });

            services.AddScoped<IUserAuthentication, AuthenticationService>();
            services.AddTransient<IEncryptionService, EncryptionService>();
            services.AddDbContext<DatabaseContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("myConnectionString"))
                    .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking), 
                ServiceLifetime.Transient);

            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => false;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDistributedMemoryCache();
            services.AddSession(options =>
            {
                options.Cookie.HttpOnly = true;
                options.Cookie.IsEssential = true;
                options.IdleTimeout = new TimeSpan(expiredSessionHours, expiredSessionMinutes, 0);
            });

            services.AddMvc(options =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                    options.Filters.Add(new AuthorizeFilter(policy));
                })
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            if (HostingEnvironment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            var supportedCultures = new[]
            {
                new CultureInfo("en-US"),
            };

            app.UseRequestLocalization(new RequestLocalizationOptions
            {
                DefaultRequestCulture = new RequestCulture("en-US"),
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures
            });

            loggerFactory.AddLog4Net();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseSession();
            app.UseAuthentication();
            app.UseMvc();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...