使用Topshelf将Hangfire作为Windows服务(.NET Core 2.2)

4

我正在尝试在控制台app .net core 2.2中使用Topshelfhangfire作为windows服务来使用。我只想加载hangfire仪表板,不添加任何工作或其他内容。

Program.cs

using System;
using Topshelf;

namespace HangfireAsService
{
 class Program
{
static void Main(string[] args)
{
  HostFactory.Run(config =>
  {
    config.Service<Bootstrap>(service =>
    {
      service.ConstructUsing(s => new Bootstrap());
      service.WhenStarted(s => s.Start());
      service.WhenStopped(s => s.Stop());
    });
    config.RunAsLocalSystem();
    config.SetDescription("Hangfire as windows Service for DataCrawling Project");
    config.SetDisplayName("Hangfire Service Custom");
   });
  }
 }
}

Bootstrap.cs

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Owin.Hosting;

namespace HangfireAsService
{
  public class Bootstrap
{
private IDisposable _host;


public void Start()
{
  var options = new StartOptions { Port = 8999 };
  _host = WebApp.Start<Startup>(options);
  Console.WriteLine();
  Console.WriteLine("Hangfire has started");
  Console.WriteLine("Dashboard is available at http://localhost:8999/hangfire");
  Console.WriteLine();
}

public void Stop()
{
  _host.Dispose();
}
}
}

Startup.cs

using Hangfire;
using Microsoft.AspNetCore.Builder;
using Owin;
using System;
using System.Collections.Generic;
using System.Text;


namespace HangfireAsService
{
 public class Startup
 {
  public void Configuration(IApplicationBuilder appBuilder)
 {
  GlobalConfiguration.Configuration
    .UseSqlServerStorage("Server=111.111.11.1\\INS2017; Database=Hangfire; user=sa; 
    password=;");
  appBuilder.UseHangfireDashboard();
  appBuilder.UseHangfireServer();

  }
 }
} 

正如您所见,我为我的“自托管OWIN”创建了2个类,并在查看“事件查看器”后得到了以下显示的错误:

无法找到源HangfireAsService的Event ID 0的说明。此事件引发组件未安装在本地计算机上或安装已损坏。您可以在本地计算机上安装或修复组件。

如果事件源来自另一台计算机,则必须使用事件保存显示信息。

以下信息包括在事件中:

服务无法启动。System.NullReferenceException:对象引用未将对象实例化。 在Microsoft.Owin.Hosting.Utilities.SettingsLoader.FromConfigImplementation..ctor()中 at Microsoft.Owin.Hosting.Utilities.SettingsLoader.<>c.b__1_0()中 at System.Threading.LazyInitializer.EnsureInitializedCore [T](T& target,Func<code>1 valueFactory)atMicrosoft.Owin.Hosting.Utilities.SettingsLoader.LoadFromConfig(IDictionary2 settings) in Microsoft.Owin.Hosting.Engine.StartContext..ctor(StartOptions options) 中 atMicrosoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options) in Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options) 中 at HangfireAsService.Bootstrap.Start() in C:\MyWorkSpace\Data Crawling\dataCrawlingConsole\HangfireAsService\Bootstrap.cs:line 17
在HangfireAsService.Program.<>c.b__0_3(Bootstrap s) 在C:\MyWorkSpace\Data Crawling\dataCrawlingConsole\HangfireAsService\Program.cs:line 15中在Topshelf.ServiceConfiguratorExtensions.<>c__DisplayClass2_0 1.<WhenStarted>b__0(T service, HostControl control) 中 at Topshelf.Builders.DelegateServiceBuilder1.DelegateServiceHandle.Start(HostControl hostControl) 中 at Topshelf.Runtime.Windows.WindowsServiceHost.OnStart(String[] args) 在System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

消息资源存在,但在消息表中找不到该消息。


请格式化您的代码示例。格式不良的代码是懒惰的表现,并传达了这个问题不值得回答的信息。 - tom redfern
如果您指的是错误部分,那么它与事件查看器显示的内容完全相同,但对于代码的三个部分,我认为它们很容易阅读。 - FarbodKain
1
不,我指的是代码示例。对你来说很清楚,因为你写了这段代码。如果你希望别人帮助你,那么你应该尽可能地让你的问题易于阅读。我点赞你的问题,因为我认为这是一个有价值的问题,但如果你想得到更多人的帮助,那么重新格式化你的代码吧。 - tom redfern
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接