会话状态变量未为所有用户设置
Session state variable not setting for all users
我有以下代码:
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() 时,会话变量被清除。 Debug/Use 任何其他浏览器,都不是问题! Chrome 有什么不同?
编辑:
将以下内容添加到 Startup.cs 看起来可以修复 Chrome(到目前为止,需要进行更多测试):
services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.IsEssential = true;
});
使用这种方法,我是否需要担心较旧的浏览器支持,例如浏览器检测?如果是这样,我该如何修改这段代码来处理?别忘了我不是直接设置 cookie,我是在页面代码本身设置会话变量。
看来这就是问题所在,一段时间以来一切正常 运行,所以只需要 Startup.cs:
中的正确 cookie 政策
services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.IsEssential = true;
});
我有以下代码:
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() 时,会话变量被清除。 Debug/Use 任何其他浏览器,都不是问题! Chrome 有什么不同?
编辑: 将以下内容添加到 Startup.cs 看起来可以修复 Chrome(到目前为止,需要进行更多测试):
services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.IsEssential = true;
});
使用这种方法,我是否需要担心较旧的浏览器支持,例如浏览器检测?如果是这样,我该如何修改这段代码来处理?别忘了我不是直接设置 cookie,我是在页面代码本身设置会话变量。
看来这就是问题所在,一段时间以来一切正常 运行,所以只需要 Startup.cs:
中的正确 cookie 政策 services.AddSession(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.IsEssential = true;
});