【问题标题】:Hangfire 1.5.3 System.MissingMethodException on all our jobsHangfire 1.5.3 System.MissingMethodException 我们所有的工作
【发布时间】:2016-05-07 10:32:10
【问题描述】:

我们刚刚将 hangfire 从 1.3.4 更新到 1.5.3。

我们的创业公司从此改变:

    private static void DoHangfire(IAppBuilder app)
    {
        var options = new BackgroundJobServerOptions
        {
            // Set thread count to 1
            WorkerCount = 1
        };

        app.UseHangfire(config =>
        {
            config.UseSqlServerStorage(ConfigurationManager.ConnectionStrings["JobsDB"].ConnectionString);
            config.UseAuthorizationFilters(new HangfireDashboardAuthorizationFilter());
            config.UseServer(options);
        });

        // Set retries to zero
        GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });

        JobActivator.Current = new WindsorJobActivator(Container.Kernel);
    }

到这里:

    private static void DoHangfire(IAppBuilder app)
    {
        var options = new BackgroundJobServerOptions
        {
            // Set thread count to 1
            WorkerCount = 1
        };

        GlobalConfiguration.Configuration.UseSqlServerStorage(
            ConfigurationManager.ConnectionStrings["JobsDB"].ConnectionString);

        app.UseHangfireDashboard("/hangfire", new DashboardOptions()
                                                  {
                                                      AuthorizationFilters = new List<IAuthorizationFilter>
                                                                                 {
                                                                                     new HangfireDashboardAuthorizationFilter()
                                                                                 }
                                                  });

        app.UseHangfireServer(options);

        // Set retries to zero
        GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });

        JobActivator.Current = new WindsorJobActivator(Container.Kernel);
    }

现在我们所有的作业(我们有 4 种不同的作业)都会立即失败并出现此错误:

System.MissingMethodException:未定义无参数构造函数 对于这个对象。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,布尔值 publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 在 System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis、布尔填充缓存、StackCrawlMark 和 stackMark)在 System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly, Boolean skipCheckThis、Boolean fillCache、StackCrawlMark& stackMark)
在 System.Activator.CreateInstance(类型类型,布尔非公共)在 System.Activator.CreateInstance(类型类型)在 Hangfire.JobActivator.SimpleJobActivatorScope.Resolve(类型类型)在 Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext 上下文)在 Hangfire.Server.BackgroundJobPerformer.c__DisplayClass3.b__0() 在 Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter 过滤器,PerformingContext preContext,Func1 continuation) at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable1 过滤器)在 Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext 上下文) 在 Hangfire.Server.Worker.PerformJob(BackgroundProcessContext 上下文, IStorageConnection 连接,字符串 jobId)

【问题讨论】:

    标签: c# hangfire


    【解决方案1】:

    这个问题与新版 Hangfire 与 Hangfire.Windsor 包的交互方式有关,它只是提供了一个自定义 JobActivator 和一个用于服务位置的 Windsor 容器。

    通过移动

    JobActivator.Current = new WindsorJobActivator(Container.Kernel);
    

    在对 app.UseHangfireServer() 的调用之上,我们能够发现真正的异常消息,它是 Castle.MicroKernel.ComponentNotFoundException,通知我们它无法连接包含我们希望 hangfire 运行的方法的依赖项。

    可以这么说,在 1.3.4 中,要运行作业,您可以这样做:

    BackgroundJob.Enqueue(() => thingWhichDoesStuff.DoStuff()); 
    

    其中 thingWhichDoesStuff 被注入到包含类中,而 hangfire.windsor JobActivator 只是神奇地能够解析为该类型。

    但是在 1.5.3 中,这种神奇的解决方案不再发生,因此您必须明确告诉 JobActivator 包含您希望 hangfire 运行的方法的类型的接口:

    BackgroundJob.Enqueue<IDoStuff>(x => x.DoStuff());  
    

    这会导致我们所有的工作重新开始工作。

    【讨论】:

    • 感谢您的回答!那是我的问题。必须在设置 JobActivator 后调用 app.UseHangfireServer()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多