EF。连接未关闭。连接的当前状态是连接 [英] EF. The connection was not closed. The connection's current state is connecting
问题描述
我有jwt auth:
I have jwt auth:
var messageHandlers = new JwtMessageHandler(_serviceProvider);
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Events = new JwtBearerEvents
{
OnMessageReceived = messageHandlers.OnMessageReceived,
},
TokenValidationParameters = tokenValidationParameters
});
JwtMessageHandler
是我的自定义处理程序。在处理程序中,我必须对数据库进行一些查询,所以我通过 ServiceProvider
并解决我的用户服务:
The JwtMessageHandler
is my custom handler. In the handler I have to make some queries to database, so I pass ServiceProvider
and resolve my user service:
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 OnMessageReceived
is called for every request.
When I have one request on page to the server or I wait one-two seconds before doing something all works fine. But, I have several pages where I make 2-3 simultaneous requests to the server. And, in this case I get error about:
连接未关闭。连接的当前状态正在连接
The connection was not closed. The connection's current state is connecting
我了解多线程的问题。应用程序启动时,$ code> JwtMessageHandler 创建一次。所以,我把行:
I understand that problem with multithreading. The JwtMessageHandler
is created once when application is started. So, I put the line:
_userService = (IUserService)_serviceProvider.GetService(typeof(IUserService));
里面的方法,它位于构造函数之前。但是,这没有帮助。此外,我试图在我的方法结束时将空值设置为 _userService
。
inside method, before it was located in the constructor. But, It didn't help. Also, I tried to set null to _userService
in the end of my method.
如何正确使用此案例?
推荐答案
尝试使用已经连接的连接 - 清除某些竞争条件的迹象。
Trying to use a connection that is already "connecting" - clear sign of some race condition.
- 重新检查
IUserService
是否注册了scope的生命周期,并且所有依赖项(userManager ,dbContext)也 - 不要在应用程序启动期间获得的范围基础服务解析中获得的
IServiceProvider
- 它与当前无关从其他一些宇宙请求范围和返回实例。使用HttpContext.RequestServices
进行服务解析。 - 检查您是否正在等待所有异步方法。如果您在执行第一个请求时仍然启动第二个请求 - 可能在连接阶段可能会捕获dbContext。
- 您的
JwtMessageHandler
实例是每个应用程序一个/单个。所以不要使用它的属性来存储_userService
(删除private IUserService _userService
)。相反,在OnMessageReceived
(var _userService = ...
)中使用本地变量。
- Re-check that
IUserService
is registered with "scope" lifetime, and all it dependencies (userManager, dbContext) too - Do not use
IServiceProvider
you obtained during app startup for scope-bases services resolution - it is NOT related to current request scope and return instances from "some other universe". UseHttpContext.RequestServices
for service resolution. - Check that your are "awaiting" all async methods. If you start second request while still executing first one - you may possibly "catch" dbContext during "connecting" stage.
- Your
JwtMessageHandler
instance is one/single per app. So don't use it's property for storing_userService
(removeprivate IUserService _userService
). Instead, use local variable insideOnMessageReceived
(var _userService = ...
).
您已经检查过(1),(2)和(3)。我认为(4)是你需要修复你的错误的最后一个。
You already checked (1), (2) and (3). I think (4) is the last one you need to fix your bug.
这篇关于EF。连接未关闭。连接的当前状态是连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!