【问题标题】:The service on Local Computer started then stopped本地计算机上的服务启动然后停止
【发布时间】:2017-11-02 16:16:13
【问题描述】:

我创建了一个已安装在多台机器上的服务。除了一个之外,它们都工作正常。当我尝试通过 Windows 服务启动服务时,出现以下错误:

The My.Service service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other services or programs.

我看到其他帖子建议您更改服务的登录属性以作为本地系统帐户登录 - 我已经这样做了。

事件查看器向我提供了以下信息:

Application: myProject.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AggregateException
Stack:
   at Microsoft.AspNetCore.Server.Kestrel.KestrelServer.Start[[Microsoft.AspNetCore.Hosting.Internal.HostingApplication+Context, Microsoft.AspNetCore.Hosting, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]](Microsoft.AspNetCore.Hosting.Server.IHttpApplication`1<Context>)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Start()
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(Microsoft.AspNetCore.Hosting.IWebHost, System.Threading.CancellationToken, System.String)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(Microsoft.AspNetCore.Hosting.IWebHost)
   at Nexus.Startup.Main(System.String[])

我尝试从命令提示符手动运行服务并传入 --debug 并收到以下错误消息:

09:05:47.289 [1] ERROR - 
System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Listener.<DisposeAsync>d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.ListenerPrimary.<DisposeAsync>d__20.MoveNext()
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout)
   at System.Threading.Tasks.Task.WaitAll(Task[] tasks, TimeSpan timeout)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.KestrelEngine.DisposeListeners(List`1 listeners)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.KestrelEngine.CreateServer(ServerAddress address)
   at Microsoft.AspNetCore.Server.Kestrel.KestrelServer.Start[TContext](IHttpApplication`1 application)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Start()
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host, CancellationToken token, String shutdownMessage)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
   at MyProject.Startup.Main(String[] args) in D:\bamboo-home\xml-data\build-dir\163841\CUT-CUP-CR\repos\myProject\Startup.cs:line 42
---> (Inner Exception #0) System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Listener.<DisposeAsync>d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.ListenerPrimary.<DisposeAsync>d__20.MoveNext()<---

我很困惑,因为该服务在其他机器上启动得非常好。

这是我的 Startup.cs 主要方法:

        public static void Main(string[] args)
    {
        var exePath = Process.GetCurrentProcess().MainModule.FileName;
        var directoryPath = Path.GetDirectoryName(exePath);

        if (Debugger.IsAttached || args.Contains("--debug"))
        {
            var host = new WebHostBuilder()
               .CaptureStartupErrors(true)
               .UseKestrel()
               .UseUrls("http://localhost:5000")
               .UseContentRoot(Directory.GetCurrentDirectory())
               .UseIISIntegration()
               .UseStartup<Startup>()
               .Build();
            host.Run();
        }
        else
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseUrls("http://localhost:5000")
                .UseContentRoot(directoryPath)
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
            host.RunAsService();
        }
    }

【问题讨论】:

  • 'System.NullReferenceException: Object reference not set to an instance of an object' 你发现什么对象是空的了吗?
  • 第 42 行是哪一行?
  • 为什么在启动服务时进入 if 块,您是在服务启动设置中传递--debug 还是在到达if (Debugger.IsAttached || args.Contains("--debug")) 行之前将调试器附加到服务?它应该进入 else 块。编辑:是的,考虑一下at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host) 在作为服务运行时不应该出现在堆栈跟踪中,而应该是at Microsoft.AspNetCore.Hosting.WebHostExtensions.RunAsService(IWebHost host)
  • 我的猜测是端口“5000”已在该机器上使用。
  • 您的 .Run() 中的某些内容为空。看起来您正在触发一堆线程并检查一些网络资源并尝试迭代返回 null 的结果。

标签: c# asp.net service event-viewer


【解决方案1】:

@ScottChamberlain 是的,我通过了 --debug – Roka545

你不能那样做。 Run() 是一个阻塞调用,它不允许 Windows 服务完全启动。即使您正在调试,您也需要始终从服务内部执行RunAsSevice()。我通常做的模式是

    if (args.Contains("--console"))
    {
        var host = new WebHostBuilder()
           .CaptureStartupErrors(true)
           .UseKestrel()
           .UseUrls("http://localhost:5000")
           .UseContentRoot(Directory.GetCurrentDirectory())
           .UseIISIntegration()
           .UseStartup<Startup>()
           .Build();
        host.Run();
    }
    else
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseUrls("http://localhost:5000")
            .UseContentRoot(directoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();
        host.RunAsService();
    }

无论是否附加调试器,当您从服务中启动该服务时,该服务将作为服务运行。如果你想独立运行它(比如在 Visual Studio 的 F5 中),你将 --console 传递给参数。

【讨论】:

  • 虽然这是真的,但我认为它本身不会产生有问题的异常和“服务启动然后停止”消息。最有可能的 OP 仅将调试选项添加到他在正常运行时在该服务器上遇到的“调试”问题(没有“调试”)。
猜你喜欢
  • 2016-10-21
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多