Asp.net核心&x2B;Hangfire以关闭或处理的连接结束

Asp.net核心&x2B;Hangfire以关闭或处理的连接结束,.net,asp.net-core,dependency-injection,hangfire,.net,Asp.net Core,Dependency Injection,Hangfire,我正在使用最新的Hangfire v1.6和asp.net core 2.1站点。我使用的是实体框架核心2.1 我向hangfire提交了一份工作,但我最终出现了一些错误,比如我的连接被关闭或已被处理 例外情况是 2018-10-25 21:35:29.1990 |[]| 10100 |错误| Microsoft.EntityFrameworkCore.Query | An 在数据库中迭代某个操作的结果时发生异常 查询上下文类型 “OmniService.DataAccess.Models.Om

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

我向hangfire提交了一份工作,但我最终出现了一些错误,比如我的连接被关闭或已被处理

例外情况是

2018-10-25 21:35:29.1990 |[]| 10100 |错误| Microsoft.EntityFrameworkCore.Query | An 在数据库中迭代某个操作的结果时发生异常 查询上下文类型 “OmniService.DataAccess.Models.OmniServiceDbContext”。 System.ObjectDisposedException:无法访问已处置的对象。A. 此错误的常见原因是处理已解决的上下文 从依赖项注入,然后稍后尝试使用相同的 应用程序中其他位置的上下文实例。如果您 正在对上下文调用Dispose(),或将上下文包装到 使用语句。如果您使用的是依赖项注入,那么应该让 依赖项注入容器负责处理上下文 实例。对象名称:“AsyncDisposer”

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

i、 e

无法跟踪实体类型“PostedData”的实例,因为 已创建另一个{'SubmitId'}具有相同键值的实例 正在跟踪。附着现有实体时,请确保只有一个实体 附加了具有给定键值的实体实例。考虑使用 “DbContextOptions Builder.EnableSensivedAtalogging”以查看 相互冲突的键值

在设置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
AddHangfire(x=>x.UseSqlServerStorage(connectionString));
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetSection(“ConnectionString:ConnectionString”).Value)、ServiceLifetime.Transient);
AddTransient(typeof(IPostedDataService)、typeof(PostedDataService));
services.AddSingleton(配置);

所以,我缺少的是为什么hangfire不喜欢我关于dbcontext的临时服务?

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

旧的

工作

public async Task ProcessPostedData(Guid submitId, int retry = 0)
我调用了一个异步方法,返回void,而它本应该是任务。我希望这能帮助其他人节省3小时

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