【问题标题】:VB.NET Windows Service works on Win8x64 but not Win2012VB.NET Windows 服务适用于 Win8x64 但不适用于 Win2012
【发布时间】:2013-08-24 09:02:45
【问题描述】:

我创建了一个应用程序作为 Windows 服务,它在运行 Windows 8 x64 的工作站上运行良好,并在 OnStart() 上的应用程序事件日志中写入了几个事件。我使用 InstallUtil 将它安装在 Windows 2012 机器上,它在启动后立即停止。我在事件日志中看到的唯一内容是在系统下:

The Foo service entered the stopped state. 
  • 如果不安装 VS2012,我什至无法在该机器上调试它,我不想这样做,因为它是在生产环境中。
  • 应用程序依赖于一个本地复制的 DLL。
  • .NET Frameworks 2.0 到 4.5 安装在两台机器上。
  • 我尝试在兼容性下以管理员身份运行,但无论如何它都设置为在 LocalService 下运行,因此它应该有权执行其任务执行的所有操作...

编辑 1:你为什么要对这个问题投反对票,甚至不评论它为什么不好?

【问题讨论】:

  • 您是否检查了事件查看器以查看其中是否有任何信息?另一种选择是将日志记录添加到您的服务并将其写入文本文件 - 您可能会发现它失败的地方。
  • 蒂姆,我在问题中提到我的应用程序在 OnStart 方法中写入了几个事件(没有一个被传递到事件日志(或事件查看器)),请重新阅读。
  • 对不起,我第一次错过了。由于没有编写任何事件,因此您可以从一个地方开始查看是否可以确定它为什么不起作用。将日志记录添加到一个文本文件中,您可以在其中记录每个步骤(如果您还没有)可能会将其缩小到它停止工作的确切位置。此外,请仔细检查您的生产框以确保 LocalService 有权写入应用程序日志。
  • 我的猜测是它会在 OnStart 引发之前停止工作,我认为这也不是权限错误。还有其他我可以查看的日志吗?
  • 没有重写您的服务,以便将每个步骤完成写入文本文件,这不是我能想到的。

标签: .net vb.net windows-services windows-server windows-server-2012


【解决方案1】:

我在调试 Windows 服务方面学到的一些东西可能会帮助您解决问题。

  1. 尝试按照 Tim 在评论中的建议将 Windows 服务中每个方法的所有内容记录到文本文件中。
  2. 通过向 appdomain 添加事件处理程序,尝试在服务退出之前捕获 UnhandledException。我有写入文本文件的日志函数。

    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException

    Public Sub CurrentDomain_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
            'Log and output exception message before the application exits.
            Dim exp = DirectCast(e.ExceptionObject, Exception)
            Dim formatexp = String.Format("Exception: {0}; Message: {1}: InnerException: {2}",
                              exp.ToString(),
                              exp.Message.ToString(),
                              exp.InnerException.ToString())
            Log(formatexp)
            Console.WriteLine(formatexp)
    
            Log("Application exited due to unhandled exception")
            Console.WriteLine("Service exited due to unhandled exception")
            'Exit the batch process gracefully.
            Environment.Exit(-1)
    End Sub
    
  3. 尝试使用 WindDbg 调试 Windows 服务崩溃或挂起问题,您可以从 Microsoft Download site 下载。

  4. 检查尝试访问服务器上任何资源的服务帐户是否可以访问它们。

  5. 如果您想查看代码的实时执行情况,请将执行情况记录到 SignalR 主机。这可能是矫枉过正,但我​​曾经有多个线程执行不同的进程,我能够使用 SignalR 调试问题。

注意:如果您可以发布一些示例代码,那么这将有助于我们帮助您。

【讨论】:

  • 谢谢!我试一试,能否请您在答案中也加入 Log 函数?
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多