ASp.Net核心2.1
我在一个控制器中设置了一个会话变量:
public ActionResult setsession()
{
HttpContext.Session.SetString("name","Fozzy");
return Ok();
}
当我在之后暂停调试器时,我可以在会话中看到该值 设置会话变量。然后,我尝试通过获取立即在另一个控制器中检索会话变量,但该变量始终为null:
public ActionResult getsession()
{
var fozzy = HttpContext.Session.GetString("name");
// fozzy is null
return Ok(fozzy);
}
我将会话超时设置为20分钟(我认为)
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20);
});
这是我的startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", builder =>
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
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.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20);
});
services.AddMvc().AddSessionStateTempDataProvider();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors("CorsPolicy");
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(name: "spa-fallback",
defaults: new { controller = "values", action = "Get" });
});
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//else
//{
// app.UseExceptionHandler("/Home/Error");
// app.UseHsts();
//}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
我的问题不是设置会话变量。我经历了那个噩梦。如果设置变量有问题,.Net Core会引发异常。我已经过去了。
如何获取会话以保留ASP.net Core 2.1中的值?谢谢
答案 0 :(得分:1)
根据the documentation on session state,您需要按照以下三个步骤在ASP.NET Core中启用会话:
要启用会话中间件,启动必须包含:
- 任何
IDistributedCache
内存缓存。IDistributedCache
实现用作会话的后备存储。有关更多信息,请参见Distributed caching in ASP.NET Core。- 调用
ConfigureServices
中的AddSession
。- 调用
Configure
中的UseSession
。
因此,除了services.AddSession()
设置常规会话服务以便可以常规访问它之外,您还需要执行services.AddDistributedMemoryCache()
以便在存储位置数据。最后,在Configure
内,您需要使用app.UseSession()
设置会话中间件,以确保在处理请求时读取了会话数据,以便您可以访问以前存储的数据。 / p>
答案 1 :(得分:0)
我意识到已经有了一个答案,但是我遇到了同样的问题,即保存到会话中的值并没有持久化,而是设法解决了我的特定问题。
我在两个域上有两台计算机,在一个域上,会话值按预期方式被保存,在另一个域上,会话值被保存,并且可以在save方法中对其进行检索,但是从另一控制器/方法中,它返回null。认为这可能是安全设置。
原来我的问题是由ConfigureServices中的CookiePolicyOptions引起的:我将CheckConsentNeeded设置为true。将其设置为false后,它可以按预期工作。
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
答案 2 :(得分:0)
设置“ options.Cookie.IsEsssential = true;”后,我遇到了同样的问题。在AddSession上。一切正常。
post