Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP Net内核中使用hangfire激活类_C#_Hangfire - Fatal编程技术网

C# 在ASP Net内核中使用hangfire激活类

C# 在ASP Net内核中使用hangfire激活类,c#,hangfire,C#,Hangfire,我在配置HangFire时遇到问题。我试图在ASP网络核心中触发并忘记一个报警呼叫 报警服务: public void FireAndForgetAlarm(int statusCode, string message, string subject = null, IList<string> attachmentFilePaths = null) { BackgroundJob.Enqueue(() => Alarm(statusCode, message, subj

我在配置HangFire时遇到问题。我试图在ASP网络核心中触发并忘记一个报警呼叫

报警服务:

public void FireAndForgetAlarm(int statusCode, string message, string subject = null, IList<string> attachmentFilePaths = null)
{
    BackgroundJob.Enqueue(() => Alarm(statusCode, message, subject, 
    attachmentFilePaths));
}
public void fireandfegtalarm(int statusCode,string message,string subject=null,IList attachmentfilepath=null)
{
BackgroundJob.Enqueue(()=>报警(状态码、消息、主题、,
附件文件路径);
}
*报警方法是公开的

错误说明:

警告:Hangfire.AutomaticRetryAttribute[0] 无法处理作业“eb7f76ea-7522-49e2-b7b9-3ed3ed091a0c”:发生异常。重试尝试2(共10次)将在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,对象[]参数) 位于Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider提供程序,类型) 位于Hangfire.AspNetCore.AspNetCoreJobActivatorScope.Resolve(类型) 在Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext上下文) 在Hangfire.Server.BackgroundJobPerformer.c_uuuDisplayClass9_0.b_uu0()上 在Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter,PerformingContext预文本,Func
1 continuation)在Hangfire.Server.BackgroundJobPerformer.c_u显示类9_1.b_uuu2()在Hangfire.Server.BackgroundJobPerformer.PerformjObjwithFilters(PerformingContext,IEnumerable
1过滤器) 位于Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext上下文) 位于Hangfire.Server.Worker.PerformJob(BackgroundProcessContext上下文、IStorageConnection连接、字符串jobId)

我的startup类包含:

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>())});
}
public void配置服务(IServiceCollection服务)
{
services.ConfigureAlarmingServices(新的AlarmingConfig()
{
Port=int.Parse(ConfigurationManager.AppSettings[“mailPort”]),//用于SSL 465
Sender=ConfigurationManager.AppSettings[“mailSender”],
SmtpServer=ConfigurationManager.AppSettings[“SmtpServer”],
Recipients=ConfigurationManager.AppSettings[“mailRecipients”],
SenderPassword=ConfigurationManager.AppSettings[“mailPassword”]
});
服务。AddHangfire(c=>{
c、 使用MemoryStorage();
});
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
app.UseHangfireServer(new BackgroundJobServerOptions(){Activator=new AspNetCoreJobActivator(app.ApplicationServices.GetRequiredService())});
}
注:

  • 我已经为startup类尝试了多个版本,包括将activator放在AddHangire方法中。实际上没有任何尝试奏效,我也正确地遵循了文档
  • 报警服务配置正确,工作时无火焰
  • 在报警配置中传递文字无效
  • 唯一的解决方案是使方法保持静态,但这不允许使用良好的DI
  • 我在他们的文档中看到了一个解决方案,他们总是有一个默认构造函数,并使用参数调用构造函数。然而,这对我来说是不可能的,因为我也在注入记录器
注释中要求的扩展方法的内容:

public static void ConfigureAlarmingServices(this IServiceCollection collection, AlarmingConfig config)
{
    collection.AddSingleton<IAlarmingService>(x=> new 
    AlarmingService(x.GetService<ILogger<IAlarmingService>>(), config));
}
公共静态无效配置AlarmingServices(此IServiceCollection集合,AlarmingConfig配置)
{
collection.AddSingleton(x=>new
AlarmingService(x.GetService(),config));
}

首先,您看到的异常的重要部分是:

尝试激活“Wms.Alarming.AlarmingService”时,无法解析类型“Wms.Alarming.AlarmingConfig”的服务

这表示在代码的某个地方(您尚未显示的部分),您正试图插入
AlarmingService
的实例

您已经配置了如何解析接口
IAlarmingService
的单例服务,这意味着您应该能够拥有一个依赖于
IAlarmingService
的类。但是,如果您的类特别依赖于
AlarmingService
(而不是接口),则会出现此错误,因为您尚未定义如何解析
AlarmingService
类型的依赖项

要么

  • 您没有显示的代码应该只依赖于
    IAlarmingService
    ,而不是具体的类本身(
    AlarmingService
    )或
  • 您还需要配置DI容器以处理特定类型的依赖项
    AlarmingService
    ,例如:
公共静态无效配置AlarmingServices(此IServiceCollection集合,AlarmingConfig配置)
{
collection.AddSingleton(
x=>newAlarmingService(x.GetService(),config));
collection.AddSingleton(x=>x.GetService());
}

我认为第一点是您需要修复的。

实际抛出错误的代码在哪里?您似乎缺少
文件存储服务的配置。您是对的@Xerilio我显示了报警服务,因为我也有报警服务问题(相同)。让我更新。@Xerilio我更新了错误消息,FileStorage服务错误消息是我的第一条错误消息,我可以通过将其设置为静态来解决。但是,此alarmingservice无法通过这种方式解决。
ConfigureAlarmingServices
是自定义方法吗?这种方法发生了什么?您似乎缺少了一个
服务。AddScoped(…)
或类似的东西。是的,这是一个扩展方法,我将报警服务注册为singleton@xerillionThing,这取决于具体的类,我使用适当的DI。第二个语句与第一个语句没有什么不同,plus作为y无效
public static void ConfigureAlarmingServices(this IServiceCollection collection, AlarmingConfig config)
{
    collection.AddSingleton<AlarmingService>(
        x => new AlarmingService(x.GetService<ILogger<AlarmingService>>(), config));
    collection.AddSingleton<IAlarmingService>(x => x.GetService<AlarmingService>());
}