Получите Hangfire, работающий с ASP.NET MVC и LightInject

У меня есть приложение ASP.NET MVC, и я недавно обновился, чтобы использовать LightInject DI. Однако я не могу заставить Hangfire работать правильно, даже используя расширение LightInject!

Моя настройка Hangfire в Startup.cs:

        public void Configuration(IAppBuilder app)
        {
            var container = new ServiceContainer();
            container.RegisterControllers(typeof(Web.Controllers.DashboardController).Assembly);

            ConfigureServices(container);

            ConfigureHangfire(container,app);

            container.EnableMvc();

        }

        private void ConfigureHangfire(ServiceContainer container, IAppBuilder app)
        {
            var hangfireConnString = ConfigurationManager.ConnectionStrings["HfConnString"].ConnectionString;

            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseLightInjectActivator(container)
                .UseSqlServerStorage(hangfireConnString, new SqlServerStorageOptions
                {
                    CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                    SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                    QueuePollInterval = TimeSpan.FromSeconds(10),
                    UseRecommendedIsolationLevel = true,
                    UsePageLocksOnDequeue = true,
                    DisableGlobalLocks = true
                });

            var options = new DashboardOptions()
            {
                Authorization = new[] {new SystemAuthorizationFilter()}
            };
            app.UseHangfireDashboard("/hangfire",options);

            app.UseHangfireServer();
        }

Однако я получаю следующую ошибку при запуске задания Hangfire:

System.NullReferenceException: Object reference not set to an instance of an object.
   at LightInject.Web.PerWebRequestScopeManager.GetOrAddScope() in C:\projects\lightinject-web\build\tmp\Net46\Binary\LightInject.Web\LightInject.Web.cs:line 148
   at LightInject.Web.PerWebRequestScopeManager.get_CurrentScope() in C:\projects\lightinject-web\build\tmp\Net46\Binary\LightInject.Web\LightInject.Web.cs:line 129
   at LightInject.ScopeManager.BeginScope() in C:\projects\lightinject\src\LightInject\LightInject.cs:line 6091

Я был бы рад любой помощи, чтобы получить это происходит! Большое спасибо заранее.


person dalcam    schedule 14.10.2019    source источник
comment
Мне интересно, должен ли Hangfire иметь свой собственный контейнер? Не уверен, что это решит проблему...   -  person dalcam    schedule 14.10.2019
comment
Это больше похоже на ASP.NET Core, чем на ASP.NET MVC - если это так, то это неправильный тег в вашем вопросе.   -  person Tieson T.    schedule 16.10.2019
comment
Привет @TiesonT. это определенно ASP.NET MVC, а не ядро ​​:)   -  person dalcam    schedule 16.10.2019
comment
Эта ошибка возникает из-за того, что они пытаются прочитать HttpContext.Current (source) — в этот момент HttpContext, скорее всего, равен нулю, учитывая внутреннюю работу Hangfire. Не уверен, почему предоставление Hangfire собственного контейнера решает проблему, если только это не означает, что HttpContext затем ограничивается Hangfire, а не хост-приложением (что имеет смысл).   -  person Tieson T.    schedule 16.10.2019
comment
Привет @TiesonT, моя работа по зависанию не ссылалась на HttpContext.current. Он вызывал одну из моих внедренных служб, которая также не использовала http.context. Я предположил, что он не находит мои внедренные услуги.   -  person dalcam    schedule 04.11.2019
comment
Возможно, вы им не являетесь, но LightInject кажется (эта ссылка на их исходный код).   -  person Tieson T.    schedule 04.11.2019
comment
Ах, да, извини @TiesonT, я не правильно прочитал твой комментарий. Это интересно. Спасибо за комментарии и ваше время! Очень ценю!   -  person dalcam    schedule 04.11.2019
comment
Не нужно извиняться - я не совсем уверен, что прав, но я видел подобные проблемы с кодом, который предполагает, что HttpContext доступен, когда код фактически вызывается.   -  person Tieson T.    schedule 05.11.2019


Ответы (1)


Я фактически исправил это, предоставив Hangfire собственный контейнер. Итак, начало моего метода ConfigureHangfire стало таким:

        private void ConfigureHangfire(ServiceContainer container, IAppBuilder app)
        {
            var hangfireConnString = ConfigurationManager.ConnectionStrings["HfConnString"].ConnectionString;

            var container = new ServiceContainer();
            ConfigureServices(container);

            GlobalConfiguration.Configuration etc....

Я не уверен, что это полностью правильно, и если это не так, я бы очень хотел, чтобы меня поправили! Но в любом случае я надеюсь, что это кому-то поможет!

person dalcam    schedule 14.10.2019