作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 jwt 认证:
var messageHandlers = new JwtMessageHandler(_serviceProvider);
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Events = new JwtBearerEvents
{
OnMessageReceived = messageHandlers.OnMessageReceived,
},
TokenValidationParameters = tokenValidationParameters
});
JwtMessageHandler
是我的自定义处理程序。在处理程序中,我必须对数据库进行一些查询,因此我传递了 ServiceProvider
并解析了我的用户服务:
public class JwtMessageHandler
{
private IUserService _userService;
public async Task OnMessageReceived(MessageReceivedContext arg)
{
//parsing header, get claims from token
...
_userService = (IUserService)arg.HttpContext.RequestServices.GetService(typeof(IUserService));
var isRoleChanged = await _userService.IsRoleChanged(tokenObject.Subject, rolesFromToken);
if (isRoleChanged)
{
GenerateBadResponse(arg);
return;
}
var canLogin = await _userService.CanLogin(tokenObject.Subject);
if (!canLogin)
{
GenerateBadResponse(arg);
return;
}
}
}
在我查询的服务中:
...
var user = await _userManager.FindByEmailAsync(email);
var currentRoles = await _userManager.GetRolesAsync(user);
..
OnMessageReceived
为每个请求调用。当我在页面上向服务器发出一个请求时,或者我在做某事之前等待一两秒钟时,一切正常。但是,我有几个页面可以同时向服务器发出 2-3 个请求。而且,在这种情况下,我收到以下错误:
The connection was not closed. The connection's current state is connecting
我理解多线程的问题。 JwtMessageHandler
在应用程序启动时创建一次。所以,我放了一行:
_userService = (IUserService)_serviceProvider.GetService(typeof(IUserService));
内部方法,在它位于构造函数之前。但是,它没有帮助。此外,我尝试在方法的末尾将 null 设置为 _userService
。
这种情况下如何正确使用?
最佳答案
尝试使用已经“连接”的连接 - 某些竞争条件的明确标志。
IUserService
是否在“作用域”生命周期内注册,以及它的所有依赖项(userManager、dbContext)IServiceProvider
进行基于范围的服务解析 - 它与当前请求范围无关,并从“其他宇宙”返回实例。使用 HttpContext.RequestServices
进行服务解析。JwtMessageHandler
实例是每个应用程序一个/单个。所以不要使用它的属性来存储 _userService
(删除 private IUserService _userService
)。相反,在 OnMessageReceived
中使用局部变量 (var _userService = ...
)。您已经检查了 (1)、(2) 和 (3)。我认为 (4) 是您需要修复错误的最后一个。
关于c# - 英孚。连接未关闭。连接的当前状态是 connecting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41217906/
我是一名优秀的程序员,十分优秀!