轨道交通无法访问已处置的对象对象名称:“ MySqlConnection”

问题描述

项目实施期间出现问题。 任务是捕获事件并在数据库中做一些工作。 似乎一切都很简单,但是我得到了一个错误 “无法访问已处置的对象。对象名称:'MysqLConnection'。”我认为此错误是由于dbContext实际上并不存在。而且我不知道如何通过Masstransit转发。

启动

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddDbContext<AuthDbContext>(options => options.UseMysqL(Configuration.GetConnectionString("IdentityServerConnection")));

        services.AddIdentity<ApplicationUserDTO,IdentityRole>();
        new IdentityBuilder(typeof(ApplicationUserDTO),typeof(IdentityRole),services)
        .AddEntityFrameworkStores<AuthDbContext>()
        .AddDefaultTokenProviders();

        //AutoMapper
        services.AddAutoMapper(typeof(MappingProfile));


        #region Masstransit RabbitMq

        services.AddScoped<createuserConsumer>();
        services.AddMasstransit(c =>
        {
            c.AddConsumer<createuserConsumer>();
        });
                  

       services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(conf =>
       {

           conf.Host(Configuration["Rabbit:Host"],host =>
           {
               host.Username(Configuration["Rabbit:Username"]);
               host.Password(Configuration["Rabbit:Password"]);
           });             

           conf.ReceiveEndpoint(Configuration["Rabbit:ReceiveEndpoint"],e =>
           {
               e.PrefetchCount = 16;
               e.UseMessageRetry(n => n.Interval(3,100));

               #region                  
               e.Consumer<createuserConsumer>(provider);                  
               #endregion

           });             

       }));

        services.AddSingleton<IPublishEndpoint>(provider => provider.GetrequiredService<IBusControl>());
        services.AddSingleton<ISendEndpointProvider>(provider => provider.GetrequiredService<IBusControl>());
        services.AddSingleton<IBus>(provider => provider.GetrequiredService<IBusControl>());

        services.AddScoped(provider => provider.GetrequiredService<IBus>().CreateRequestClient<createuserConsumer>());

        services.AddSingleton<IHostedService,BusService>();

        #endregion


        #region Services 
        services.AddScoped<IAuth,AuthService>();
        #endregion
    }

消费者:

public class createuserConsumer : IConsumer<IUserCreate>
{
    private IAuth _authService;
    private IMapper _mapper;      
    public createuserConsumer(IAuth _authService,IMapper _mapper)
    {
        this._authService = _authService;
        this._mapper = _mapper;
        _context = context;
    }

    public Task Consume(ConsumeContext<IUserCreate> context)
    {
        var model = _mapper.Map<IUserCreate,UserRegisterDTO>(context.Message);                      
        var s = _authService.Registerasync(model);
        return Task.CompletedTask;
    }
}

AuthService:

public class AuthService : IAuth
    {
        private  UserManager<ApplicationUserDTO> _userManager;
        private  RoleManager<IdentityRole> _roleManager;
        private  IMapper mapper;

        public AuthService(
            UserManager<ApplicationUserDTO> userManager,RoleManager<IdentityRole> roleManager,IMapper mapper)
        {
            _userManager = userManager;
            _roleManager = roleManager;
            this.mapper = mapper;
        }

        public string Register(UserRegisterDTO model)
        {
            try
            {
                var newUser = _userManager.FindByNameAsync(model.UserName); //**Exception**
                if (newUser != null)
                {
                    throw new Exception("blablabla");
                }
            }
            catch (Exception exp)
            {
                var s = exp;
            }
            return "";           
        }
}

错误

 fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
       Failed executing DbCommand (121ms) [Parameters=[@__normalizedUserName_0='?' (Size = 256)],CommandType='Text',CommandTimeout='1200']
       SELECT `a`.`Id`,`a`.`AccessFailedCount`,`a`.`ConcurrencyStamp`,`a`.`Email`,`a`.`EmailConfirmed`,`a`.`FIO`,`a`.`LockoutEnabled`,`a`.`LockoutEnd`,`a`.`normalizedEmail`,`a`.`normalizedUserName`,`a`.`PasswordHash`,`a`.`PhoneNumber`,`a`.`PhoneNumberConfirmed`,`a`.`SecurityStamp`,`a`.`TwoFactorEnabled`,`a`.`UserName`
       FROM `AspNetUsers` AS `a`
       WHERE `a`.`normalizedUserName` = @__normalizedUserName_0
       LIMIT 1 fail: Microsoft.EntityFrameworkCore.Query[10100]
       An exception occurred while iterating over the results of a query for context type 'Auth.API.Context.AuthDbContext'.
       System.ObjectdisposedException: Cannot access a disposed object.
       Object name: 'MysqLConnection'.
          at MysqL.Data.MysqLClient.MysqLConnection.VerifyNotdisposed() in
 C:\projects\MysqLconnector\src\MysqLConnector\MysqL.Data.MysqLClient\MysqLConnection.cs:line
 707

我认为该错误是由于以下事实造成的:调用_UserManager时,数据库上下文不再存在。

告诉我我在做什么错?!?!

解决方法

我认为这就是问题所在

    var s = _authService.RegisterAsync(model);
    return Task.CompletedTask;

我相信甚至您的IDE都会发出警告“正在访问已处置的闭包”,因为您既不等待任务也不返回它。

这很可能会起作用

return _authService.RegisterAsync(model);

问题可能出在其他地方,因为我看不到注册DbContext的代码。

此外,我建议注册MassTransit及其所有必需的依赖项,因为它们是described in the docs