Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.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# ASP.NET Web API JWT间歇性401错误_C#_Asp.net_Asp.net Web Api_Jwt - Fatal编程技术网

C# ASP.NET Web API JWT间歇性401错误

C# ASP.NET Web API JWT间歇性401错误,c#,asp.net,asp.net-web-api,jwt,C#,Asp.net,Asp.net Web Api,Jwt,在Web API中使用带有有效令牌的JWTBeareAuthentication时,我偶尔会遇到401个错误。在大多数情况下,它似乎工作得很好,但偶尔它会无缘无故地开始使用401。我可以使用邮递员与完全相同的令牌后,它给我的错误,它的工作良好 似乎一旦开始提供401,它们就会越来越频繁地出现,直到应用程序无法使用为止。然后我循环使用应用程序池,它似乎可以恢复一段时间。内存使用似乎没有失控,所以我不认为这是内存泄漏 以下是启动中的配置 var configurationManager=新配置管理

在Web API中使用带有有效令牌的JWTBeareAuthentication时,我偶尔会遇到401个错误。在大多数情况下,它似乎工作得很好,但偶尔它会无缘无故地开始使用401。我可以使用邮递员与完全相同的令牌后,它给我的错误,它的工作良好

似乎一旦开始提供401,它们就会越来越频繁地出现,直到应用程序无法使用为止。然后我循环使用应用程序池,它似乎可以恢复一段时间。内存使用似乎没有失控,所以我不认为这是内存泄漏

以下是启动中的配置


var configurationManager=新配置管理器(
权限+“/.众所周知的/openid配置”,
新的OpenIdConnectConfigurationRetriever(),
新的HttpDocumentRetriever());
app.useJWTBeareAuthentication(新的JWTBeareAuthenticationOptions
{
AuthenticationMode=AuthenticationMode.Active,
TokenValidationParameters=新的TokenValidationParameters
{
ValidAudience=“观众”,
ValidIssuer=权威,
IssuerSigningKeyResolver=(令牌、安全令牌、标识符、参数)=>
{
var discoveryDocument=Task.Run(()=>configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
返回discoveryDocument.SigningKeys;
}
}
});
这是相关的软件包


我用这个来构建应用程序


以前有人见过类似的情况吗?

几乎没有信息可以找到可能的原因。但是,我们可以考虑一件事,委托本身是一个同步块,但是您在同一个上下文中调用一个名为<代码> Aycy的方法。这很可能被死锁阻止

var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
而是将代码转换为此代码-

var discoveryDocument = configurationManager.GetConfigurationAsync().ConfigureAwait(false).GetAwaiter().GetResult();
你可以在这篇博文中读到它-

不确定这是否是导致问题的原因。一种可能的假设是,此代码导致死锁,并且池中的线程可能已经用完,并且随着时间的推移,
401
的副作用也在增加

我建议运行内存分析器,看看这是否真的会导致死锁

var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
让我知道这些是否解决了问题