问题描述
项目实施期间出现问题。 任务是捕获事件并在数据库中做一些工作。 似乎一切都很简单,但是我得到了一个错误 “无法访问已处置的对象。对象名称:'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。