Asp.net core + 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 exception occurred in the database while iterating the results of a query for context type 'OmniService.DataAccess.Models.OmniServiceDbContext'. System.ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. Object name: 'AsyncDisposer'....

Я использую Microsoft DI (не autofac), и кажется, что единственный способ сохранить свое соединение открытым - это настроить его как Singleton. Как только я это сделаю, я вижу ошибки, связанные с тем, что контекст отслеживает уже существующий экземпляр ... конечно, я могу гарантировать, что отслеживание не используется, но похоже, что это не решение.

т.е.

The instance of entity type 'PostedData' cannot be tracked because another instance with the same key value for {'SubmitId'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.

В части настройки 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?

0
0
1 026
1

Ответы 1

Нашел свой ответ с помощью поста ниже. Я думал, что пропустил некоторую конфигурацию Hangfire. Фактически я внес это изменение

СТАРЫЙ

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

РАБОТАЮЩИЙ

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

Я вызывал асинхронный метод, возвращающий void, хотя должен был быть Task. Надеюсь, это поможет кому-то еще сэкономить 3 часа.

Нет доступа к удаленному объекту Asp.net Identity Core

Другие вопросы по теме