c# - Hangfire 1.5.3 System.MissingMethodException 在我们所有的工作上

标签 c# hangfire

我们刚刚将 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: No parameterless constructor defined for this object. at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at Hangfire.JobActivator.SimpleJobActivatorScope.Resolve(Type type) at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context) at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass3.b__0() at Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter filter, PerformingContext preContext, Func1 continuation) at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable1 filters) at Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext context) at Hangfire.Server.Worker.PerformJob(BackgroundProcessContext context, IStorageConnection connection, String jobId)

最佳答案

这个问题与新版本的 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 被注入(inject)到包含类中,而 hangfire.windsor JobActivator 神奇地能够解析为该类型。

但是在 1.5.3 中这个神奇的解决方案不再发生,所以你必须明确地告诉 JobActivator 包含你希望 hangfire 运行的方法的类型的接口(interface):

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

这会使我们所有的作业重新开始工作。

关于c# - Hangfire 1.5.3 System.MissingMethodException 在我们所有的工作上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35088769/

相关文章:

c# - 使用hangfire在分布式环境中每天发送电子邮件

azure - 是什么导致 azure 托管的hangfire 作业出现这样的行为?

c# - 如何修改列表属性而不影响同类型的其他列表属性?

c# - WebApi 中的默认 HTTP 动词是什么?获取还是发布?

javascript - 将文本框值传递给 JavaScript 中的编辑函数

asp.net - 在 asp.net 表单中使用hangfire 创建计划(延迟)重复作业

C# + MySQL + ExecuteNonQuery 在更新时返回 '1' 但不在数据库中更改

c# - 存储来自其他程序的事件

.net - 检查hangfire重复作业是否已经在运行

c# - 永不运行的 Hangfire cron 表达式