У меня есть веб-приложение ASP.NET Core, которое использует сессию для хранения некоторых переменных. Все отлично работает локально в любом сценарии, но по какой-то причине я не могу получить значения из сеанса в какой-то момент (они нулевые) на компьютере Azure.
Сценарий:
- Выполнение входа в систему, которая перенаправляет на другой контроллер (сохранение пользовательских данных в сеансе)
- Ввести некоторые необходимые данные, а затем перенаправить на другой контроллер (также сохранить некоторые данные в сеансе и получить другие значения)
- На странице «Указатель» укажите дополнительные данные для сеанса. Представление этого контроллера вызывает функцию JavaScript, которая вызывает " OnScrollEnd ", который является методом, реализованным этим контроллером.
- Когда пользователь прокручивает страницу вниз, вызывается та же самая функция javascript (которая вызывает OnScrollEnd )
- Этот метод пытается получить данные из сеанса, но теперь он нулевой.
(приведенный выше сценарий демонстрирует, что по существу состояние сеанса работает, но в какой-то момент не удается получить значения)
Вход:
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();
}