英孚.连接没有关闭.连接的当前状态是连接 [英] EF. The connection was not closed. The connection's current state is connecting

查看:34
本文介绍了英孚.连接没有关闭.连接的当前状态是连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 jwt 身份验证:

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

我理解多线程的问题.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)); 

在方法内部,之前它位于构造函数中.但是,它没有帮助.此外,我尝试在我的方法结束时将 null 设置为 _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.

这种情况下如何正确使用?

How to correctly use in this case?

推荐答案

尝试使用已经正在连接"的连接 - 某些竞争条件的明显迹象.

Trying to use a connection that is already "connecting" - clear sign of some race condition.

  1. 重新检查 IUserService 是否已注册范围"生命周期,以及所有它的依赖项(userManager、dbContext)
  2. 不要使用您在应用启动期间获得的 IServiceProvider 用于基于范围的服务解析 - 它与当前请求范围无关,并从其他宇宙"返回实例.使用 HttpContext.RequestServices 进行服务解析.
  3. 检查您是否正在等待"所有异步方法.如果您在执行第一个请求的同时启动第二个请求 - 您可能会在连接"阶段捕获"dbContext.
  4. 您的 JwtMessageHandler 实例是一个/单个每个应用程序.所以不要使用它的属性来存储 _userService(删除 private IUserService _userService).相反,在 OnMessageReceived 中使用局部变量(var _userService = ...).
  1. Re-check that IUserService is registered with "scope" lifetime, and all it dependencies (userManager, dbContext) too
  2. 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". Use HttpContext.RequestServices for service resolution.
  3. 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.
  4. Your JwtMessageHandler instance is one/single per app. So don't use it's property for storing _userService (remove private IUserService _userService). Instead, use local variable inside OnMessageReceived (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.

这篇关于英孚.连接没有关闭.连接的当前状态是连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆