Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SignOutAsync不';不要退出_C#_Ajax_Asp.net Mvc_Asp.net Core_Asp.net Identity - Fatal编程技术网

C# SignOutAsync不';不要退出

C# SignOutAsync不';不要退出,c#,ajax,asp.net-mvc,asp.net-core,asp.net-identity,C#,Ajax,Asp.net Mvc,Asp.net Core,Asp.net Identity,在我的ASP.NET核心应用程序中,我有以下方法来注销用户: [HttpPost(“注销”)] 公共异步任务注销() { 等待_signInManager.SignOutAsync(); } 我通过以下途径检查当前用户名: [HttpGet(“getusername”)] 公共字符串GetUserName() { 返回_userManager.GetUserName(用户); } 然而,当调用该路由时,第二个路由的行为将继续,就好像用户已登录一样。声称如果客户端未处理SignOutAsync

在我的ASP.NET核心应用程序中,我有以下方法来注销用户:

[HttpPost(“注销”)]
公共异步任务注销()
{
等待_signInManager.SignOutAsync();
}
我通过以下途径检查当前用户名:

[HttpGet(“getusername”)]
公共字符串GetUserName()
{
返回_userManager.GetUserName(用户);
}
然而,当调用该路由时,第二个路由的行为将继续,就好像用户已登录一样。声称如果客户端未处理SignOutAsync生成的HTTP响应,但通过AJAX请求该响应,则可能发生这种情况,代码如下:

异步函数注销(){
let response=wait-fetch('/api/user/logout',{method:'post'});
if(response.ok){
Cookies.remove('username');
window.location.reload();
}否则{
警报(`由于网络错误而无法注销:${response.status}${response.statusText}`)
}
}

因此,更改被处理。当注销AJAX调用结束会话时,为什么这段代码的行为不符合预期?我使用Linux上的Firefox 81.0.1作为我的客户端。

我解决了这个问题。这分别取决于Asp.net Core和Firefox的两个意外事实:

  • 当从Asp.net核心路由返回空白字符串时,它返回HTTP 204无内容
  • 当Firefox收到HTTP 204 No Content的响应时,它不会加载新页面,而只是再次显示旧页面(带有一个提示正在进行实际刷新的闪光灯!)

总之,当我注销时,用户名注销发生在后端,但我没有意识到,因为当我在另一个选项卡中刷新用户名检查路径时,用户名重新出现。我认为这是Firefox的一个问题。

你能调试C代码吗?当你认为是的时候,它真的被呼叫了吗?它是否抛出任何异常?
\u signInManager.SignOutAsync()
有什么作用?@devNull我刚刚通过调试器确认调用了该方法,并且它没有引发任何异常。is
window.location.reload()正在发生?
然而,当调用该路由时,第二个路由的行为仍然像用户登录一样。
您是否禁用了第二个路由的缓存?@mjwills我刚刚调查了第二个路由的缓存,结果发现这是Firefox中的一些意外UI+一些意外的ASP.Net核心行为。我会在我的自我回答中给出详细信息。
但只会再次显示旧页面(带有一个提示正在进行实际刷新的闪光灯!)。
是否已禁用页面上的缓存?如果不是,Firefox呈现页面的旧副本是有效的。@mjwills我没有明确禁用缓存,尽管开发工具没有说缓存正在发生,我希望刷新以禁用缓存(至少对于我正在刷新的主页)。也许可以尝试禁用主机页和
GetUserName
端点的缓存。@mjwills感谢您的建议,但我现在就不谈了,因为我知道如何处理这个问题,而且我还有比弄清楚如何禁用调试路由的缓存更重要的事情要担心。-要明确的是,如果不禁用已验证端点的缓存,您将反复遇到此类问题。这些都不是“意外”的问题。