首页 文章

AspNetCore 2.1中的TempData始终为null

提问于
浏览
0

在我的一个Controller的动作中,我设置了TempData [“key”] = true . 当我尝试在将用户重定向到另一个操作时读取值时,它总是返回null . 我已经阅读了这里提供的所有帖子以及微软的文档,但似乎没有任何帮助解决我的问题 . 我还不知道我还能做些什么 .

在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

谁能说我在这里做错了什么?

UPDATE 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 . 我不知道还能做什么 . 我开始觉得我正在敲打砖墙...

UPDATE 2

我启动了一个新项目并使用了与上面相同的配置设置 . 结果与我之前描述的相同:

1 回答

  • 0

    临时数据有两种不同的内置提供程序: SessionStateTempDataProviderCookieTempDataProvider . 后者将直接使用cookie来保存用户的临时数据 . 前者将使用会话状态来持久保存临时数据 . 由于会话状态本身也使用cookie来标识用户会话,因此两种解决方案都依赖于cookie .

    现在,在典型的API情况下,您正在处理根据定义无状态的REST . 这意味着cookie,一种保持状态的机制,不会与它一起使用 . 因此,您既不能在API中使用临时数据也不能使用会话状态 .

    虽然可以设置自己的临时数据提供者,例如使用例如来自您的身份验证的用户ID从中央存储中查找临时数据,这样做会再次将状态引入您的API,这通常是不鼓励的 .

    相反,您应确保您的API尽可能无状态,并且客户端会传递请求所需的所有内容 .

    当然,如果您不想做REST,您也可以只要求API客户端本地存储cookie .

相关问题