Asp.net Core + Hangfire заканчивается закрытым или удаленным соединением - PullRequest
0 голосов
/ 26 октября 2018

Я использую последнюю версию Hangfire v1.6 с сайтом asp.net core 2.1.Я использую ядро ​​Entity Framework 2.1

Я отправляю задание в Hangfire, но у меня возникают ошибки, например, если мое соединение закрыто или удалено.

Исключение при ...

2018-10-25 21: 35: 29.1990 | [] | 10100 | ERROR | Microsoft.EntityFrameworkCore.Query | В базе данных возникла исключительная ситуация при повторении результатов запроса для типа контекста 'OmniService.DataAccess.Models.OmniServiceDbContext.System.ObjectDisposedException: невозможно получить доступ к удаленному объекту.Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения.Это может произойти, если вы вызываете Dispose () для контекста или заключаете контекст в оператор using.Если вы используете внедрение зависимости, вы должны позволить контейнеру введения зависимости позаботиться об удалении экземпляров контекста.Имя объекта: '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?

1 Ответ

0 голосов
/ 26 октября 2018

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

OLD

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

...