HttpContext.Session 包含一个环境中的密钥,但不包含另一个环境中的密钥

HttpContext.Session contains keys in one environment but not the other

我有一个 .NET Core 2.1 MVC 项目,我按照 this link 的步骤升级到 .NET Core 3.0。该项目使用 IHttpContextAccessor 将多个值存储在 HttpContext.Session 集合中,当我在我的开发环境中使用 F5 启动项目时,一切似乎都在工作。但是当我将项目发布到我的测试服务器时,会话密钥集合为空并且值不再存在。

因为代码在两个环境中应该是相同的,我想这一定与项目的会话配置方式有关,但我一直无法找到解决方案。我的 Startup.cs 是这样配置的:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddDistributedMemoryCache();
    services.AddSession();
    ...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    app.UseSession();
    ...
}

我尝试使用 Newtonsoft 序列化 Session 对象,但结果非常有限:

{"IsAvailable":true,"Id":"44b1d511-e0cb-a1a3-c117-84033b80df25","Keys":[]}

不幸的是,项目本身不能 运行,而是依赖于外部输入,因此需要花费大量时间来测试每个场景。在我完全剥离项目之前,我想知道是否有人对我可以做些什么来找出造成这种情况的原因提出建议。

我今天遇到了类似的问题。所以我更新了 web.config ,它是从已发布的项目生成的,以添加以下代码。

<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

注意:我运行宁应用程序处于自包含模式并且 ApplicationPool 设置为无托管代码,最后我使用 urlrewrite 将代理反向代理到 localhost:5000 到 运行 。 iis 上的网络核心应用程序

我终于弄明白问题出在哪里了,有点失误。在 Startup.cs 中添加会话作为服务时,我似乎忘记配置 cookie 设置。所以不是这个:

services.AddSession();

应该是这样的:

services.AddSession(options =>
{
    options.Cookie.SecurePolicy = CookieSecurePolicy.None;
    options.Cookie.SameSite = SameSiteMode.None;
});

为什么我让它在我的本地环境中工作仍然没有答案。也许这与我从本地主机(MVC 项目的同一域)上的测试页面访问 MVC 项目这一事实有关,但在我的测试服务器上,MVC 项目位于不同的域中。尽管如此,现在一切都很顺利。