C# 使用NLog时出现Hangfire错误

C# 使用NLog时出现Hangfire错误,c#,asp.net-mvc,logging,nlog,hangfire,C#,Asp.net Mvc,Logging,Nlog,Hangfire,因此,我试图让我的应用程序每分钟向文本文件发送一个字符串,因此在我的Global.asax.cs文件中,我有以下设置: public class Startup { public void Configuration(IAppBuilder app) { GlobalConfiguration.Configuration .UseSqlServerStorage("AppContext"); app.UseHangfi

因此,我试图让我的应用程序每分钟向文本文件发送一个字符串,因此在我的Global.asax.cs文件中,我有以下设置:

public class Startup
{

    public void Configuration(IAppBuilder app)
    {
        GlobalConfiguration.Configuration

            .UseSqlServerStorage("AppContext");

        app.UseHangfireDashboard();

        app.UseHangfireServer();

    }
}

public class HeartbeatSetup
{
    public static void Heartbeat()
    {
        var config = new NLog.Config.LoggingConfiguration();

        var logFile = new NLog.Targets.FileTarget() { FileName = "heartbeat.txt", Name = "logfile" };

        config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Trace, logFile));

        NLog.LogManager.Configuration = config;

        var logger = NLog.LogManager.GetCurrentClassLogger();

        var currentTime = DateTime.Now.ToString();

        RecurringJob.AddOrUpdate("heartbeat", () => logger.Trace("Test"), Cron.Minutely);
    }
}
因此,这将创建作业并每分钟运行一次,但作业未完成并引发以下错误:

没有为此对象定义无参数构造函数


有人对此有解决方案或替代方法吗?

因此我通过引用下面创建的另一个静态方法修复了此问题:

public class HeartbeatSetup
{
    public static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    public static void Heartbeat()
    {
        try
        {
            RecurringJob.AddOrUpdate("heartbeat", () => Fire(), Cron.Minutely);
        }
        catch (Exception ex)
        {
            logger.Fatal(ex, "error");
            throw;
        }
    }

    public static void Fire()
    {
        var config = new NLog.Config.LoggingConfiguration();

        var logFile = new NLog.Targets.FileTarget("logfile") { FileName = "heartbeat.txt" };

        config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logFile);

        NLog.LogManager.Configuration = config;

        var currentTime = DateTime.Now.ToString();

        try
        {
            logger.Info(currentTime + " - beep");
        }
        catch (Exception ex)
        {
            logger.Fatal(ex + " - beeeeeeeeeeeeeeeeeeeeeeeeeeeeeep");
        }

    }
}

另一种选择是使用合适的酒吧间,而不是壁炉。但是,如果Hangfire是您的唯一选项,那么您可以尝试将调用的内容包装为创建并配置logger作为公共静态方法,而无需任何参数。还可以看看Hangfire如何在SqlServer表中存储注册的委托。这可能会为您提供关于什么是可运行的Hangfire呼叫目标的线索