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

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

问题描述

我有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.


  1. 重新检查 IUserService 是否注册了scope的生命周期,并且所有依赖项(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.

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

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