use*_*173 6 c# asp.net entity-framework entity-framework-core asp.net-core
我有jwt auth:
var messageHandlers = new JwtMessageHandler(_serviceProvider);
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Events = new JwtBearerEvents
{
OnMessageReceived = messageHandlers.OnMessageReceived,
},
TokenValidationParameters = tokenValidationParameters
});
Run Code Online (Sandbox Code Playgroud)
这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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在服务中我提出查询:
...
var user = await _userManager.FindByEmailAsync(email);
var currentRoles = await _userManager.GetRolesAsync(user);
..
Run Code Online (Sandbox Code Playgroud)
在OnMessageReceived
被称为为每个请求.当我在服务器的页面上有一个请求或我在做某事之前等待一两秒钟一切正常.但是,我有几个页面,我同时向服务器发出2-3个请求.而且,在这种情况下,我得到错误:
连接没有关闭.连接的当前状态是连接
我理解多线程的问题.该JwtMessageHandler
应用程序启动时创建一次.所以,我把这条线:
_userService = (IUserService)_serviceProvider.GetService(typeof(IUserService));
Run Code Online (Sandbox Code Playgroud)
inside方法,在它位于构造函数中之前.但是,它没有帮助.此外,我试图_userService
在我的方法的最后设置null .
在这种情况下如何正确使用?
Dmi*_*try 12
试图使用已经"连接"的连接 - 明确某些竞争条件的迹象.
IUserService
已注册"scope"生命周期,以及所有依赖项(userManager,dbContext)IServiceProvider
在app启动期间获得的基于范围的服务解析 - 它与当前请求范围无关,并且从"其他某个Universe"返回实例.使用HttpContext.RequestServices
服务的分辨率.JwtMessageHandler
实例是每个应用一个/单个.所以不要使用它的属性来存储_userService
(删除private IUserService _userService
).而是在inside OnMessageReceived
(var _userService = ...
)中使用局部变量.您已经检查过(1),(2)和(3).我认为(4)是你需要修复bug的最后一个.
归档时间: |
|
查看次数: |
9495 次 |
最近记录: |