在AspNetCore 2.1中,TempData始终为null

时间:2018-12-09 15:54:28

标签: c# asp.net-core

在控制器的一项操作中,我设置了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

我开始了一个新项目,并使用了与上述相同的配置设置。结果与我之前描述的相同:

null TempData value

Configuration

Dependencies

1 个答案:

答案 0 :(得分:0)

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

现在,在典型的API情况下,您正在处理REST,根据定义它是无状态的。这意味着不使用cookie(保持状态的一种机制)。因此,您无法在API中使用临时数据或会话状态。

虽然可以建立自己的使用例如身份验证中的用户ID来从中央存储区查找临时数据,这样做通常会再次向您的API中引入状态。

相反,您应该确保您的API尽可能是无状态的,并确保客户端将请求中的所有必需内容都传递了。

当然,如果您不想执行REST,也可以只要求API客户端在本地存储Cookie。