gpt4 book ai didi

c# - 英孚。连接未关闭。连接的当前状态是 connecting

转载 作者:太空狗 更新时间:2023-10-29 21:04:05 25 4
gpt4 key购买 nike

我有 jwt 认证:

var messageHandlers = new JwtMessageHandler(_serviceProvider);

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Events = new JwtBearerEvents
{
OnMessageReceived = messageHandlers.OnMessageReceived,
},
TokenValidationParameters = tokenValidationParameters
});

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;
}
}
}

在我查询的服务中:

...
var user = await _userManager.FindByEmailAsync(email);
var currentRoles = await _userManager.GetRolesAsync(user);
..

OnMessageReceived 为每个请求调用。当我在页面上向服务器发出一个请求时,或者我在做某事之前等待一两秒钟时,一切正常。但是,我有几个页面可以同时向服务器发出 2-3 个请求。而且,在这种情况下,我收到以下错误:

The connection was not closed. The connection's current state is connecting

我理解多线程的问题。 JwtMessageHandler 在应用程序启动时创建一次。所以,我放了一行:

_userService = (IUserService)_serviceProvider.GetService(typeof(IUserService)); 

内部方法,在它位于构造函数之前。但是,它没有帮助。此外,我尝试在方法的末尾将 null 设置为 _userService

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

最佳答案

尝试使用已经“连接”的连接 - 某些竞争条件的明确标志。

  1. 重新检查 IUserService 是否在“作用域”生命周期内注册,以及它的所有依赖项(userManager、dbContext)
  2. 不要使用您在应用程序启动期间获得的 IServiceProvider 进行基于范围的服务解析 - 它与当前请求范围无关,并从“其他宇宙”返回实例。使用 HttpContext.RequestServices 进行服务解析。
  3. 检查您是否正在“等待”所有异步方法。如果您在执行第一个请求的同时开始第二个请求 - 您可能会在“连接”阶段“捕获”dbContext。
  4. 您的 JwtMessageHandler 实例是每个应用程序一个/单个。所以不要使用它的属性来存储 _userService(删除 private IUserService _userService)。相反,在 OnMessageReceived 中使用局部变量 (var _userService = ...)。

您已经检查了 (1)、(2) 和 (3)。我认为 (4) 是您需要修复错误的最后一个。

关于c# - 英孚。连接未关闭。连接的当前状态是 connecting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41217906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com