我正在使用ASP.NET MVC应用程序工作,该应用程序使用Hangfire来为项目的不同部分排队工作。
作为参考,该项目被设置为单个应用程序,而多个库被称为我们之前处理过的其他项目。 hangfire服务器是从MVC应用程序设置的,所有调用要入队的作业的方法都位于该应用程序的不同控制器中。不同的引用库有不同的控制器。
我能够为第一个图书馆成功创建工作;他们入队,处理,完成或成功失败。现在的问题是,我试图将第二个库添加到Hangfire设置中,当我尝试加入新工作时,我在Hangfire仪表板中得到一个Could not load type 'SPPC_Jobs.Controllers.FB.FBMetricsController' from assembly 'SPPC_Jobs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
。由于排队是在直接引用和使用该库的控制器中发生的,因此我对发生这种情况的原因感到困惑。我还能够从控制器的操作中直接调用该库的方法,并且它可以正常工作,仅在转到Hangfire时遇到问题。
以下是项目中使用的一些代码来演示设置以及如何尝试将作业入队。
GlobalConfiguration.Configuration.UseMongoStorage("...");
app.UseHangfireDashboard("/hangfire", new DashboardOptions = {
Authorization = System.Linq.Enumerable.Empty<IDashboardAuthorizationFilter()
});
var options = new BackgroundJobServerOptions { Queues = new[] { "scp", "metrics" } };
app.UseHangfireServer(options);
值得一提的是它正在使用MongoDB配置。我最初在config选项中没有单独的队列,但是在对此进行了一些研究之后,这似乎可能有所帮助。每个控制器的动作都装饰有Queue属性。
第一个控制器调用BackgroundJob.Schedule(() => Processor(id), scheduleDate);
,它引用了我创建的另一个动作,称为Processor
。处理器获取ID,查询数据库(SQL Server DB,不是mongo)以获取记录,然后在引用的库中调用服务ProcessorService
。
[Queue("scp")]
public Void Processor(int id) {
var callback = repo.GetSocialCallback(id);
//-- Referenced library
var processorService = new ProcessorService();
processorService.Process(callback);
}
第二个控制器以与第一个相同的方式调用第二个库的方法:
BackgroundJob.Enqueue(() => Enqueue(providerClientAccount));
入队方法调用引用的库的方法,如下所示:
[Queue("metrics")]
public void Enqueue(ProviderClientAccount providerAccount) {
//-- Referenced library
var metricsService = new MetricsService();
metricsService.Call(providerAccount);
}
我看到的唯一真正的区别是第二个控制器正在传递整个对象,而不是ID。我也尝试过仅将ID传递给Enqueue
方法,查询该方法中的对象然后调用它,但最终还是得到相同的结果。
在类似情况下我能找到的所有问题/教程/错误都使用了多个项目,并为Hangfire仪表板使用了一个中央应用程序,或者使用了与我当前使用的配置不同的配置。我不明白的是,对于第二个库,当我尝试将作业入队时,它引发错误,提示它无法加载类型FBMetricsController
,这是从中调用它的控制器,因此我不知道我在想什么。
对此将提供任何帮助或建议。
答案 0 :(得分:0)
发现更大的问题是,有一个活动的Azure实例正在运行单独的hangfire服务器,而没有最新的代码,因此该实例是在本地而不是本地服务器上获取的。