简体   繁体   English

无法访问已处置的 object。 Object 名称:AspNet Core/EF Core 项目中出现“IServiceProvider”错误

[英]Cannot access a disposed object. Object name: 'IServiceProvider' error in AspNet Core/EF Core project

I am writing an ASP.NET Core application with Entity Framework Core.我正在使用 Entity Framework Core 编写 ASP.NET Core 应用程序。 I'm also using MediatR.我也在使用 MediatR。

When I trigger a database update, be it save or delete, I get this error:当我触发数据库更新时,无论是保存还是删除,都会出现以下错误:

Cannot access a disposed object.无法访问已处置的 object。 Object name: 'IServiceProvider' Object 名称:'IServiceProvider'

It sometimes happens on the first try, sometimes on subsequent ones.它有时会在第一次尝试时发生,有时会在后续尝试中发生。 I can't seem to find the pattern.我似乎找不到模式。 What I did manage to do is hit the breakpoint in handler which calls await _applicationDbContext.SaveChangesAsync(cancellationToken);我所做的是在调用await _applicationDbContext.SaveChangesAsync(cancellationToken);的处理程序中打断点。 although the error actually gets thrown in controller, on await _mediator.Send(someRequestModel);尽管错误实际上是在 controller 中引发的,但在await _mediator.Send(someRequestModel); . . After the error gets thrown, the app goes in break mode and crashes.引发错误后,应用程序进入中断模式并崩溃。

I'll use dummy names, but this is the relevant code, I think:我将使用虚拟名称,但我认为这是相关代码:

Controller: Controller:

public MyController(IMediator mediator)
{
    _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}

[HttpDelete("{id}")]
public async void Delete(string id)
{
    await _mediator.Send(new DeleteRequestModel(Guid.Parse(id))); // error thrown here
}

Handler:处理程序:

public class DeleteCommandHandler : IRequestHandler<DeleteRequestModel>
{
    private readonly ApplicationDbContext _applicationDbContext;

    public DeleteCommandHandler(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
    }

    public async Task<Unit> Handle(DeleteRequestModel request, CancellationToken cancellationToken)
    {
        var item = _applicationDbContext.MyData.First(x => x.Id == request.Id);
        _applicationDbContext.MyData.Remove(item);

        await _applicationDbContext.SaveChangesAsync(cancellationToken); // pretty sure this errors out

        return Unit.Value;
    }
}

Startup.cs:启动.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnectionString")));
    services.AddDbContext<ApplicationAspNetUsersDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnectionString")));

    services.AddDatabaseDeveloperPageExceptionFilter();

    services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationAspNetUsersDbContext>();

    services.AddIdentityServer()
        .AddApiAuthorization<ApplicationUser, ApplicationAspNetUsersDbContext>();

    services.AddAuthentication()
        .AddIdentityServerJwt();
    services.AddControllers();
    services.AddRazorPages();
    // In production, the Angular files will be served from this directory
    services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; });

    services.AddSwaggerDocument();

    services.AddMediatR(AppDomain.CurrentDomain.Load("MySolution.MyProject.EntityFramework"));
    services.AddValidatorsFromAssembly(AppDomain.CurrentDomain.Load("MySolution.MyProject"));
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidatorPipelineBehavior<,>));

    services.AddSingleton(x =>
        new BlobServiceClient(Configuration.GetConnectionString("AzureBlobStorageConnection")));
    services.AddApplicationInsightsTelemetry(Configuration["APPINSIGHTS_CONNECTIONSTRING"]);

    services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
    services.Configure<AzureBlobStorage>(Configuration.GetSection("AzureBlobStorage"));
    services.Configure<ApplicationInsights>(Configuration.GetSection("ApplicationInsights"));
}

Finally, here is the stack trace, this time for update action:最后,这是堆栈跟踪,这次是更新操作:

at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException()
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.GetActionsForException(Type exceptionType, TRequest request, MethodInfo& actionMethodInfo)
at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.<Handle>d__2.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MediatR.Pipeline.RequestPostProcessorBehavior`2.<Handle>d__2.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MediatR.Pipeline.RequestPreProcessorBehavior`2.<Handle>d__2.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)   
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at MySolution.Web.Controllers.MyController.< Patch >d__7.MoveNext() in
..\Controllers\MyController.cs:line 85

Any help is greatly appreciated.任何帮助是极大的赞赏。

You are using an async void in your controller.您在 controller 中使用了异步 void。 Async void should only be used in specific scenarios, in this case you should be using a Task as the return type. Async void 应该只在特定场景中使用,在这种情况下,您应该使用 Task 作为返回类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 AutoMapper IValueResolver:无法访问已处理的对象。 对象名称:&#39;IServiceProvider&#39; - AutoMapper IValueResolver: Cannot access a disposed object. Object name: 'IServiceProvider' Azure function 启动时出错:无法访问已处置的 object。Object 名称:'IServiceProvider' - Azure function error on startup: Cannot access a disposed object. Object name: 'IServiceProvider' .Net core/EF:无法访问已处置的 object。 此错误的常见原因是处理上下文 - .Net core/EF : cannot access a disposed object. A common cause of this error is disposing a context .Net Core 2.1 - 无法访问已处置的 object.Object 名称:'IServiceProvider' - .Net Core 2.1 - Cannot access a disposed object.Object name: 'IServiceProvider' 无法访问已处置的 object。 Object 名称:“IServiceProvider”,同时使用后台队列 - Cannot access a disposed object. Object name: 'IServiceProvider' while working with background queue Asp.net 内核:无法访问已处置的 object。 此错误的常见原因是处理从依赖注入中解析的上下文 - Asp.net core: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection ObjectDisposedException:无法访问已处置的对象。 对象名称:“调度程序” - ObjectDisposedException: Cannot access a disposed object. Object name: 'Dispatcher' C#&#39;无法访问已处置的对象。 对象名称:“ SslStream”。 - C# 'Cannot access a disposed object. Object name: 'SslStream'.' HangFire“无法访问已处置的对象。对象名称:'SqlDelegatedTransaction'” - HangFire "Cannot access a disposed object. Object name: 'SqlDelegatedTransaction'" 无法访问已处置的对象。 对象名称:&#39;tlsxyz&#39; - Cannot access a disposed object. Object name: 'tlsxyz'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM