Asp.net Core + Hangfire最终以关闭或处置连接而告终

时间:2018-10-26 04:06:43

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

我正在将最新的Hangfire v1.6与asp.net core 2.1站点一起使用。我正在使用Entity Framework core 2.1

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

...时的例外情况

  

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

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

  

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

关于设置dbcontext

{{1}}

所以,我想念的是为什么hangfire为什么不像我在dbcontext方面的临时服务那样?

1 个答案:

答案 0 :(得分:1)

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

OLD

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

工作

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

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

Cannot access a disposed object Asp.net Identity Core