【问题标题】:Windows Service NullReferenceException C#Windows 服务 NullReferenceException C#
【发布时间】:2020-04-19 17:31:15
【问题描述】:

我正在尝试创建一个 Web API 服务,但是当我尝试作为服务运行时,我得到了NullReferenceException。如果我删除 ServiceBase 部分,它运行良好。如果我替换 Thread 什么都不做,那么它会照常工作。

什么可能导致NullReferenceException

namespace WebApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //To Debug
             //BuildWebHost(args).Run();

             //To Run as Service 
             using (var service = new TestService())
             {
                ServiceBase.Run(service);
             }
        }

        public static IWebHostBuilder BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseUrls("http://localhost:5000");

    }
}
class TestService : ServiceBase
    {
        public TestService()
        {
            ServiceName = "TestService";
        }

        protected override void OnStart(string[] args)
        {
            string filename = CheckFileExists();
            File.AppendAllText(filename, $"{DateTime.Now} started.{Environment.NewLine}");            
            Thread t = new Thread(new ThreadStart(Program.BuildWebHost(args).Build().Run));
            t.Start();
        }

        protected override void OnStop()
        {
            string filename = CheckFileExists();
            File.AppendAllText(filename, $"{DateTime.Now} stopped.{Environment.NewLine}");
        }

        private static string CheckFileExists()
        {
            string filename = @"c:\tmp\MyService.txt";
            if (!File.Exists(filename))
            {
                File.Create(filename);
            }

            return filename;
        }

    }

【问题讨论】:

标签: c# service nullreferenceexception


【解决方案1】:

很难通过代码找到 NullReferene。但是您可以使用以下方法使其可调试:

var s1 = new TestService();
if (!Environment.UserInteractive)
    ServiceBase.Run(new ServiceBase[] { s1 }); // when running as service
else
{
    s1.Start(args); // when running as console
    Console.ReadLine();
    s1.Stop();
}

这将作为 Windows 服务或控制台应用程序启动。

把这段代码放到Program.Main方法中,在debug下运行。

PS 还有Topshelf library 也可以为您处理这些东西(将应用程序作为服务或控制台运行)。

PPS 似乎您需要添加 public void TestService.Start 方法才能使此 UserInteractive 方法有效:

public class TestService : ServiceBase
{
  // existing code

  public void Start(string[] args)
  {
    OnStart(args);
  }

  public void Stop()
  {
    OnStop();
  }
}

【讨论】:

  • 受保护的方法由于其保护级别而无法访问。似乎无法更改为公开。
  • @Foong 你说得对,应该添加新的公共方法。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多