【问题标题】:Start service on other machine: service on Local Computer started and then stopped在其他机器上启动服务:本地计算机上的服务启动然后停止
【发布时间】:2014-06-26 04:34:35
【问题描述】:

我创建了一个 C# windows 服务并在我的本地开发者机器上成功安装了它(它运行良好)。

现在我正在尝试在另一台机器上安装该服务。 我将“Release”文件夹复制到新机器并安装了服务。

当我在新机器上启动服务时,出现以下错误: “本地计算机上的服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止。”

我没有在应用程序事件日志中收到任何消息,我什至在程序的第一行添加了调试消息,但我在事件查看器中什么也看不到(好像代码根本没有启动)。 :/

我做错了什么?

【问题讨论】:

  • 请通过OnStart 方法发布代码。
  • 我删除了指向您网站的随机链接。不要那样做。与您的帖子完全无关。
  • Windows 服务的常见首次部署问题与事件日志有关。如果您的服务使用自定义源写入应用程序事件日志,则需要创建源。通常安装程序会为您执行此操作。暂时尝试在 LocalSystem 等特权帐户下运行该服务,以查看您的事件是否显示。
  • 用你的调试器附加到远程机器上

标签: c# windows service


【解决方案1】:

当你的服务器在启动过程中抛出异常时,通常会出现“启动然后停止”消息。这可能有很多原因,包括无效路径和由于缺少源或权限不足而无法写入应用程序事件日志。

我通常会包含一个选项,以将我的服务作为控制台应用程序运行。 这允许我使用Console.WriteLine 显示任何异常。

以下假设您的服务扩展自 System.ServiceProcess.ServiceBase

partial class MyService : ServiceBase
{
    private static void Main(string[] args)
    {
        MyService svc = new MyService();

        if (Environment.UserInteractive)
            RunConsole(args, svc);
        else
            Run(svc);
    }

    public MyService()
    {
        InitializeComponent();
    }

    protected static bool KeepRunning { get; set; }

    protected override void OnStart(string[] args)
    {
        StartServiceHost();
    }

    protected override void OnStop()
    {
        StopServiceHost();
    }

    protected override void OnShutdown()
    {
        StopServiceHost();
        base.OnShutdown();
    }

    private static void RunConsole(string[] args, ConverterService svc)
    {
        // need to hold on to Ctrl+C, otherwise StopServiceHost() never gets called
        Console.CancelKeyPress += (sender, e) => ShutDown(svc);

        KeepRunning = true;

        svc.OnStart(args);
        Console.WriteLine("Press <Ctrl+C> to exit.");
        while (KeepRunning)
        {
            Console.ReadLine();
        }
    }

    private void StartServiceHost()
    {
        // start your service
    }

    private void StopServiceHost()
    {
        // stop your service
    }

    private static void ShutDown(MyService svc)
    {
        Console.WriteLine("exiting...");
        svc.OnStop();
        KeepRunning = false;
    }
}

【讨论】:

  • 这是在开发人员机器上调试的最佳解决方案,但我的问题是在其他机器上 - 所以调试的正确方法是写入 Applicaiton 事件日志。
【解决方案2】:

嗯,我发现了问题:

我使用 DataProctionScope.LocalMachine 进行密码解密。 所以当我换了机器——解密失败了。

我不得不在本地机器上重新加密密码,然后解密工作正常。

感谢您的回复!

*由于我的错,eventlog调试没有成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多