在控制器的一项操作中,我设置了TempData [“ key”] = true。当我尝试在将用户重定向到其他操作时读取值时,它始终返回null。我已经阅读了这里所有可用的帖子以及Microsoft的文档,但是似乎没有任何东西可以帮助解决我的问题。我不知道我还能做什么。
在ConfigureServices中:
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddSessionStateTempDataProvider();
services.AddSession();
在Configure()中:
app.UseSession();
app.UseMvc();
在第一个动作中:
TempData["value"] = true;
在第二个动作中:
var value = TempData["value"]; // --> this is always null
有人可以在这里说我在做什么错吗?
更新1
现在,ConfigureServices()看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ITempDataProvider, SessionStateTempDataProvider>();
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddSessionStateTempDataProvider();
services.AddSession();
var connectionString = "connectionString";
services.AddDbContext<PlannerContext>(o => o.UseSqlServer(connectionString));
services.AddScoped<IPlannerRepository>(provider =>
new PlannerRepository(provider.GetService<PlannerContext>()));
services.AddScoped<IScheduleSpecific>(provider =>
new ScheduleSpecific(provider.GetService<PlannerContext>()));
services.AddSingleton<ILoggerFactory, LoggerFactory>();
}
和Configure()方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/error");
}
app.UseSession();
app.UseMvc();
}
我仍然无法从TempData [“ key”]获取值。它一直返回null。我不知道该怎么办我开始觉得自己在砖墙上敲打头……
更新2
我开始了一个新项目,并使用了与上述相同的配置设置。结果与我之前描述的相同:
答案 0 :(得分:0)
有两种不同的内置临时数据提供程序:SessionStateTempDataProvider
和CookieTempDataProvider
。后者将直接使用cookie来为用户保留临时数据。前者将使用会话状态来保留临时数据。由于会话状态本身 也使用cookie来标识用户会话,因此两种解决方案都依赖于cookie。
现在,在典型的API情况下,您正在处理REST,根据定义它是无状态的。这意味着不使用cookie(保持状态的一种机制)。因此,您无法在API中使用临时数据或会话状态。
虽然可以建立自己的使用例如身份验证中的用户ID来从中央存储区查找临时数据,这样做通常会再次向您的API中引入状态。
相反,您应该确保您的API尽可能是无状态的,并确保客户端将请求中的所有必需内容都传递了。
当然,如果您不想执行REST,也可以只要求API客户端在本地存储Cookie。