繁体   English   中英

HttpContext.Session 在一个环境中包含键,但在另一个环境中不包含键

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

我有一个 .NET Core 2.1 MVC 项目,我根据此链接逐步升级到 .NET Core 3.0。 该项目使用IHttpContextAccessor将多个值存储在HttpContext.Session集合中,当我在开发环境中使用 F5 启动项目时,一切似乎都正常。 但是当我将项目发布到我的测试服务器时,session 密钥集合是空的,并且值不再存在。

因为这两个环境的代码应该是相同的,所以我想它一定与项目的会话配置方式有关,但我一直无法找到解决方案。 这就是我的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 object 但结果非常有限:

{"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 上运行 .net 核心应用程序

我终于弄清楚了问题所在,这有点大错特错。 Startup.cs中添加 session 作为服务时,我似乎忘记配置 cookie 设置。 所以代替这个:

services.AddSession();

应该是这样的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM