我有一个ASP.NET Core Web应用程序,该应用程序使用会话存储一些变量。在任何情况下,本地都可以正常工作,但是由于某些原因,我无法在Azure计算机上的某个时刻从会话中检索值(它们为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.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.7545ms 2019-04-23 14:12:34,221 [29]信息 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [(null)] <(null)>-执行的动作 MyWebService.Controllers.AllCardsController.OnScrollEnd(MyWebService) 在0.7545ms 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();
}