C# 服务器端.NET核心中的Session.SetString()产生错误;响应启动后无法建立会话";

C# 服务器端.NET核心中的Session.SetString()产生错误;响应启动后无法建立会话";,c#,asp.net-core,.net-core,blazor,blazor-server-side,C#,Asp.net Core,.net Core,Blazor,Blazor Server Side,我有一个服务器大小的Blazor应用程序,当第一次加载页面时,它需要在会话中写入一些内容,然后从该页面和其他页面的会话中读取 现在,在OnInitializedAsync()中调用该Session.String()。但是,我遇到了一个异常“响应启动后无法建立会话”。从我发现的少量文档来看,这通常发生在SignalR与应用程序一起使用时 1) 我不认为我在使用SignalR,除非默认情况下将其配置为在服务器端.net核心代码中使用(在这种情况下,我如何发现?) 2) 我还尝试将调用放在OnInit

我有一个服务器大小的Blazor应用程序,当第一次加载页面时,它需要在会话中写入一些内容,然后从该页面和其他页面的会话中读取

现在,在OnInitializedAsync()中调用该Session.String()。但是,我遇到了一个异常“响应启动后无法建立会话”。从我发现的少量文档来看,这通常发生在SignalR与应用程序一起使用时

1) 我不认为我在使用SignalR,除非默认情况下将其配置为在服务器端.net核心代码中使用(在这种情况下,我如何发现?) 2) 我还尝试将调用放在OnInitialized()和onAfterRender()中(同步方法),但没有任何帮助。 3) 我认为我的HTTPContextAccessor和ISession配置正确,因为我可以随时使用Session.GetString(),包括在调用Session.SetString()之前。 4) 由于各种原因,我无法切换到客户端大小的Blazor应用程序。 5) 我正在使用app.UseEndpoints(),因此app.useMvc()被注释掉,因为它们不能同时使用

在我将大量代码粘贴到这里之前,有没有人能从头脑中清楚地知道会出现什么问题?下面是我到目前为止所掌握的一些片段

//Startup.cs
public IHttpContextAccessor HtppContextAccessor { get; }
// ...

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();

    services.AddHttpContextAccessor();

    //services.AddMvc(); //TODO: DO I NEED IT?
    services.AddDistributedMemoryCache();  //TODO : DO I NEED IT? // Adds a default in-memory implementation of IDistributedCache
    services.AddSession();

    //services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();


}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSession();


    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();


    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });

}

//**************************************************************************
//myfile.razor

protected override async Task OnInitializedAsync()
{
    var sampleValue = Session.GetString("testName1"); //this call is ok
    Session.SetString("testName1", "testValue2"); //this is where exception occurs
}
//Startup.cs
公共IHttpContextAccessor HtpContextAccessor{get;}
// ...
public void配置服务(IServiceCollection服务)
{
services.AddRazorPages();
AddServerSideBlazor();
AddHttpContextAccessor();
//services.AddMvc();//TODO:我需要它吗?
services.AddDistributedMemoryCache();//TODO:我需要它吗?//添加IDistributedCache的默认内存实现
services.AddSession();
//services.AddSingleton();
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
app.UseSession();
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage(“/_主机”);
});
}
//**************************************************************************
//myfile.razor
受保护的重写异步任务OnInitializedAsync()
{
var sampleValue=Session.GetString(“testName1”);//此调用正常
Session.SetString(“testName1”、“testValue2”);//这就是异常发生的地方
}

谢谢

这可能是因为Asp.Net Core不会将任何cookie(包括会话cookie)写入响应,除非最终用户根据Asp.Net Core中支持的欧盟通用数据保护条例(GDPR)给予同意,并且默认情况下获得用户的同意

您可以尝试将会话Cookie设置为应用程序所必需的,以克服以下问题:

(来自文件:)

会话状态cookie不是必需的。禁用跟踪时,会话状态不起作用。以下代码使会话cookie变得至关重要:

services.AddSession(options =>
{
    options.Cookie.IsEssential = true;
});
更好的是,您可以按照同一篇文章中的指导使用用户同意功能

你问的另一个问题

services.AddDistributedMemoryCache();  //TODO : DO I NEED IT? // Adds a default in-memory implementation of IDistributedCache
services.AddSession();
对,;您需要设置一个分布式缓存,如下所示:

要启用会话中间件,启动必须包含:

任何IDistributedCache内存缓存。IDistributedCache实现用作会话的备份存储。有关详细信息,请参阅ASP.NET Core中的分布式缓存

对ConfigureServices中AddSession的调用

在配置中调用UseSession