如何解决未为所有用户设置会话状态变量
我有以下代码:
public async Task<IActionResult> OnPost(string PaRes)
{
GenerateAbsoluteURLs();
if (string.IsNullOrEmpty(PaRes))
{
throw new Exception($"BAR OnPost() PaRes param string missing from initial response");
}
try
{
HttpContext.Session.SetString("PaRes",PaRes);
}
catch (Exception)
{
throw new Exception($"BAR OnPost() Could not set session variables");
}
string _PaRes;
try
{
_PaRes = HttpContext.Session.GetString("PaRes");
}
catch (Exception)
{
throw new Exception($"BAR OnPost() Could not get session variables");
}
if (string.IsNullOrEmpty(_PaRes))
{
throw new Exception($"BAR OnPost() PaRes retrieved null");
}
await Task.CompletedTask;
return Page();
}
public async Task<JsonResult> OnPostCompleteProcessResponse(string result)
{
string _PaRes;
try
{
_PaRes = HttpContext.Session.GetString("PaRes");
}
catch (Exception)
{
throw new Exception($"BAR OnPCPR() Could not get session variables");
}
if (string.IsNullOrEmpty(_PaRes))
{
throw new Exception($"BAR OnPCPR() PaRes retrieved null");
}
}
页面最初是通过 OnPost() 请求调用的。
OnPostCompleteProcessResponse() 在页面加载时通过 ajax 调用。
在调试过程中,OnPostCompleteProcessResponse() 在 OnPost() 之后完成。
上述代码在上周左右为越来越多的用户抛出异常:“BAR OnPCPR() PaRes 检索空值”。他们似乎都在使用 Chrome,但不知道是否与此有关。
在 Startup.cs 中,我设置了:
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
我无法理解上述情况是如何发生的。我曾考虑禁用 cookie,但它现在在上周影响了近 50% 的用户,而且这似乎很高,可以将其归结为这一点,只是出乎意料?
有人能帮我指明正确的方向吗?
谢谢。
编辑: 这现在发生在我和其他人身上,而且只在 Chrome 上发生。我会说现在几乎是100%。我们中的一些人上周没有受到影响,即使在 Chrome 上也是如此,但本周,我们也受到了影响。即使在调试模式下, OnPost() 也会首先运行,并且会话变量是可检索的。一秒钟后,当 OnPostCompleteProcessResponse() 被调用时,会话变量被清除。调试/使用任何其他浏览器,不是问题! Chrome 有什么不同?
编辑: 将以下内容添加到 Startup.cs 以修复 Chrome(到目前为止,需要更多测试):
services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.IsEssential = true;
});
使用这种方法,我是否需要担心旧浏览器支持,例如浏览器检测?如果是这样,我该如何修改这段代码来处理?别忘了我不是直接设置cookies,我是在页面代码中设置会话变量。
解决方法
所以看起来这就是问题所在,并且一切都运行良好有一段时间,所以只需要在 Startup.cs 中使用正确的 cookie 策略:
services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.IsEssential = true;
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。