EF.连接没有关闭.连接的当前状态是连接

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

试图使用已经"连接"的连接 - 明确某些竞争条件的迹象.

  1. 重新检查是否IUserService已注册"scope"生命周期,以及所有依赖项(userManager,dbContext)
  2. 不要使用IServiceProvider在app启动期间获得的基于范围的服务解析 - 它与当前请求范围无关,并且从"其他某个Universe"返回实例.使用HttpContext.RequestServices服务的分辨率.
  3. 检查您是否"等待"所有异步方法.如果在仍然执行第一个请求时启动第二个请求 - 您可能在"连接"阶段"捕获"dbContext.
  4. 您的JwtMessageHandler实例是每个应用一个/单个.所以不要使用它的属性来存储_userService(删除private IUserService _userService).而是在inside OnMessageReceived(var _userService = ...)中使用局部变量.

您已经检查过(1),(2)和(3).我认为(4)是你需要修复bug的最后一个.