0

コンソール プロジェクトで開始する作業中の Web API サービスがあります。今、私はそれをサービスとして実行したいと考えています。

次のコードで installutil.exe を使用して、サービスとしてインストールします。

[RunInstaller(true)]
 public    class ApplicationInstaller:Installer
{
    private ServiceProcessInstaller processInstaller;
    private ServiceInstaller serviceInstaller;

    public ApplicationInstaller()
    {

        serviceInstaller = new ServiceInstaller();
        processInstaller = new ServiceProcessInstaller();
        processInstaller.Account = ServiceAccount.LocalSystem;

        serviceInstaller.StartType = ServiceStartMode.Automatic;
        serviceInstaller.ServiceName = "WTT Rumsa";
        serviceInstaller.Description = "Web API for WTT Rumsa";

        Installers.Add(serviceInstaller);
        Installers.Add(processInstaller);


    }



}

これは、サービスを開始するために使用するものです。

     public static void StartService()
    {
        var startOptions = new StartOptions();
        var internalURL = $"http://{Environment.MachineName}:6666";
        startOptions.Urls.Add(internalURL);
        _logger.Debug($"Service started at: {internalURL}");

        startOptions.Urls.Add("http://localhost:6666");


        foreach(var address in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
        {
            if(address.AddressFamily==AddressFamily.InterNetwork)
            {
                var ipURL = $"http://{address.ToString()}:6666";

                _logger.Debug($"Service started at: {ipURL}");

                startOptions.Urls.Add(ipURL);


            }
        }

        using(WebApp.Start<SelfHostConfiguration>(startOptions))
        {
            Console.WriteLine($"Service started and listening at {internalURL}");
            Console.ReadLine();
        }
    }

サービスを開始すると、ロガーはそれが StartService() までずっと実行されていることを示します。クライアントで呼び出している IP を追加したことがわかります。サービスを開始した後、サービスが停止しません。

ただし、接続すると、「ターゲットマシンが積極的に拒否したため、接続できませんでした」というメッセージが表示されます

アカウントの種類は ServiceAccount.LocalSystem であり、実際に開始する (そして例外をスローしない) ため、権限は問題ないはずです。私が使用しているポートのローカル ファイアウォールに例外を追加しました。

他に何が間違っている可能性がありますか?

編集:コンソールおよびサービスとして実行されているWebサービスを使用してコマンドウィンドウでnetstat -anoを実行し、サービスとして実行するとリストに表示されず、コンソールアプリとして実行すると表示されます。ファイアウォールの設定の問題?

4

2 に答える 2

2

Ok。解決策 (または問題) を見つけました。まず、コンソール アプリをサービスとして実行すると、コンパイラは Console.WriteLine と Console.ReadLine をスキップします (Console の型全体が単に無視されると思います)。

これは、プログラムが using ステートメントから抜け出すことを意味します。

    using(WebApp.Start<SelfHostConfiguration>(startOptions))
    {
        Console.WriteLine($"Service started and listening at {internalURL}");
        Console.ReadLine();
    }

サーバーが破棄されているため、これは明らかに悪いことです。デバッグが困難だったのは、Console.ReadLine がなくてもサービスが停止するまで終了しないという事実でした。通常のコンソール アプリケーションであれば、終了していたはずです。したがって、解決策は次のようにサービスを開始することでした。

_webapp = WebApp.Start<SelfHostConfiguration>("http://+:8080");

于 2016-07-06T06:17:06.253 に答える
1

ServiceBase.Run(...) を使用し、ServiceBase クラスを実装する必要があります。ServiceBase.Run(...) は、Windows サービス ホストから停止を受信するまでブロック呼び出しです。例はこちら

于 2016-07-08T14:45:36.117 に答える