会话变量立即为空.ASP.net核心
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话变量立即为空.ASP.net核心相关的知识,希望对你有一定的参考价值。
ASp.Net核心2.1
我在一个控制器中设置了一个会话变量:
public ActionResult setsession()
HttpContext.Session.SetString("name","Fozzy");
return Ok();
当我在设置会话变量后暂停调试器时,我可以在此时看到会话中的值。然后,我尝试通过fetch立即在另一个控制器中检索会话变量,但它始终为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中的值?谢谢
根据the documentation on session state,您需要按照以下三个步骤在ASP.NET Core中启用会话:
要启用会话中间件,Startup必须包含:
- 任何
IDistributedCache
内存缓存。IDistributedCache
实现用作会话的后备存储。有关更多信息,请参阅Distributed caching in ASP.NET Core。- 在
AddSession
打电话给ConfigureServices
。- 在
UseSession
打电话给Configure
。
因此,除了设置常规会话服务以便您可以访问它的services.AddSession()
之外,您还需要执行services.AddDistributedMemoryCache()
以便存储数据。最后,在Configure
中,您需要使用app.UseSession()
设置会话中间件,以确保在处理请求时读取会话数据,以便您可以访问以前存储的数据。
我意识到已经有了这个问题的答案,但是我遇到了同样的问题,其中保存到会话的值没有保留,但设法解决了我的具体问题。
我在两个域上有两台机器,在一个域上会话值按预期保存,另一个域保存,并且可以在save方法中检索它,但是从另一个控制器/方法返回null。想象它可能是安全设置。
事实证明我的问题是由ConfigureServices中的CookiePolicyOptions引起的:我将CheckConsentNeeded设置为true。将其设置为false后,它按预期工作。
services.Configure<CookiePolicyOptions>(options =>
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
);
以上是关于会话变量立即为空.ASP.net核心的主要内容,如果未能解决你的问题,请参考以下文章