【问题标题】:Asp.net Core + Hangfire ends up with closed or disposed connectionAsp.net Core + Hangfire 以关闭或释放的连接结束
【发布时间】:2018-10-26 04:06:43
【问题描述】:

我正在使用带有 asp.net core 2.1 站点的最新 Hangfire v1.6。我正在使用实体框架核心 2.1

我向 hangfire 提交了一个作业,但我最终遇到了错误,例如我的连接已关闭或已被释放。

...时的异常

2018-10-25 21:35:29.1990|[]|10100|错误|Microsoft.EntityFrameworkCore.Query|An 迭代结果时数据库中发生异常 查询上下文类型 'OmniService.DataAccess.Models.OmniServiceDbContext'。 System.ObjectDisposedException:无法访问已处置的对象。一种 此错误的常见原因是处理已解决的上下文 从依赖注入,然后尝试使用相同的 应用程序中其他地方的上下文实例。如果您可能会发生这种情况 在上下文上调用 Dispose(),或者将上下文包装在 使用语句。如果你使用依赖注入,你应该让 依赖注入容器负责处理上下文 实例。对象名称:'AsyncDisposer'....

我使用的是 Microsoft DI(不是 autofac),看来我可以保持连接打开的唯一方法是将其设置为 Singleton。一旦我这样做了,我就会看到上下文正在跟踪一个已经存在的实例的错误......当然我可以确保不使用跟踪,但这似乎不是解决方案。

无法跟踪实体类型“PostedData”的实例,因为 {'SubmitId'} 具有相同键值的另一个实例已经存在 被跟踪。附加现有实体时,确保只有一个 附加了具有给定键值的实体实例。考虑使用 'DbContextOptionsBuilder.EnableSensitiveDataLogging' 查看 键值冲突。

在设置 dbcontext 方面

//hangfire
services.AddHangfire(x => x.UseSqlServerStorage(connectionString));
services.AddDbContext<OmniServiceDbContext>(options => 
        options.UseSqlServer(Configuration.GetSection("ConnectionStrings:ConnectionString").Value), ServiceLifetime.Transient);

services.AddTransient(typeof(IPostedDataService), typeof(PostedDataService));
services.AddSingleton<IConfiguration>(Configuration);

那么,我缺少的是为什么hangfire 不喜欢我关于 dbcontext 的瞬态服务?

【问题讨论】:

    标签: .net asp.net-core dependency-injection hangfire


    【解决方案1】:

    在下面的帖子的帮助下找到了我的答案。 我以为我错过了一些 Hangfire 配置。事实上我做了这个改变

    public async void ProcessPostedData(Guid submitId, int retry = 0)
    

    工作

    public async Task ProcessPostedData(Guid submitId, int retry = 0)
    

    我正在调用一个返回 void 的异步方法,而它本应是 Task。我希望这可以帮助其他人节省 3 个小时。

    Cannot access a disposed object Asp.net Identity Core

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多