【发布时间】:2021-02-14 07:33:46
【问题描述】:
我在配置 HangFire 时遇到问题。我试图在 ASP Net Core 中触发并忘记一个令人震惊的调用。
报警服务:
public void FireAndForgetAlarm(int statusCode, string message, string subject = null, IList<string> attachmentFilePaths = null)
{
BackgroundJob.Enqueue(() => Alarm(statusCode, message, subject,
attachmentFilePaths));
}
*Alarm 方法是公开的。
错误描述:
警告:Hangfire.AutomaticRetryAttribute[0] 无法处理作业“eb7f76ea-7522-49e2-b7b9-3ed3ed091a0c”:发生异常。 10 次重试第 2 次将在 00:01:02 执行。 System.InvalidOperationException:尝试激活“Wms.Alarming.AlarmingService”时无法解析“Wms.Alarming.AlarmingConfig”类型的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider 提供程序) 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider 提供程序,类型 instanceType,Object[] 参数) 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider 提供程序,类型类型) 在 Hangfire.AspNetCore.AspNetCoreJobActivatorScope.Resolve(类型类型) 在 Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext 上下文) 在 Hangfire.Server.BackgroundJobPerformer.c__DisplayClass9_0.b__0() 在 Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter 过滤器,PerformingContext preContext,Func
1 continuation) at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass9_1.<PerformJobWithFilters>b__2() at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable1 过滤器) 在 Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext 上下文) 在 Hangfire.Server.Worker.PerformJob(BackgroundProcessContext context, IStorageConnection connection, String jobId)
我的启动类包含:
public void ConfigureServices(IServiceCollection services)
{
services.ConfigureAlarmingServices(new AlarmingConfig()
{
Port = int.Parse(ConfigurationManager.AppSettings["mailPort"]), // for SSL 465
Sender = ConfigurationManager.AppSettings["mailSender"],
SmtpServer = ConfigurationManager.AppSettings["smtpServer"],
Recipients = ConfigurationManager.AppSettings["mailRecipients"],
SenderPassword = ConfigurationManager.AppSettings["mailPassword"]
});
services.AddHangfire(c => {
c.UseMemoryStorage();
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHangfireServer(new BackgroundJobServerOptions(){Activator = new AspNetCoreJobActivator(app.ApplicationServices.GetRequiredService<IServiceScopeFactory>())});
}
注意事项:
- 我已经为启动类尝试了多个版本,包括将激活器放在 AddHangire 方法中。没有任何尝试真正奏效,我也正确地遵循了文档。
- 报警服务配置正确,无需 HangFire 即可工作。
- 在警报配置中传递文字不起作用
- 唯一的解决方案是使方法静态化,但这不允许好的 DI
- 我在他们的文档中看到了一个解决方案,他们总是有一个默认构造函数并使用参数调用构造函数。但是,这对我来说是不可能的,因为我也在注入记录器。
在 cmets 中请求的扩展方法的内容:
public static void ConfigureAlarmingServices(this IServiceCollection collection, AlarmingConfig config)
{
collection.AddSingleton<IAlarmingService>(x=> new
AlarmingService(x.GetService<ILogger<IAlarmingService>>(), config));
}
【问题讨论】:
-
实际抛出错误的代码在哪里?您似乎缺少
FileStorageService的配置。 -
你是对的@Xerillio 我展示了警报服务,因为我也遇到了警报服务的问题(相同)。让我更新。
-
@Xerillio 我更新了错误消息,filestorageservice 错误消息是我的第一个错误消息,我可以通过将其设为静态来解决。然而,这种令人担忧的服务无法以这种方式解决。
-
ConfigureAlarmingServices是自定义方法吗?这种方法发生了什么?您似乎缺少services.AddScoped<AlarmingService>(...)或类似的东西。 -
是的,这是一种扩展方法,我将警报服务注册为单例@Xerillio