2017-06-14 10 views
3

ASP.NETコアWebアプリケーションとコンソールアプリケーションの2種類の.NETコアプロジェクトが表示されます。私は、Docker環境(Linuxコンテナ)にWindowsサービスのようなものを構築したいと思います。そこでは、プロセスが開始され、無期限に実行され、指示されたときにのみ停止します。いずれのプロジェクトタイプも適切ではないようです。何か不足していますか?Linuxドッカーコンテナを対象とした長期実行.NETコアサービスの作成

+3

Windowsサービスは、基本的にはサービスマネージャによって開始/停止されるコンソールアプリケーションです。 – mason

答えて

3

どちらのタイプには理にかなって、それはあなたがと通信を計画してどのように依存しますこのサービス。

一部のTCPポートで標準HTTP経由で通信する場合は、ASP.NetコアWebアプリケーションを使用すると作業が簡単になります。

RabbitMQ、Kafka、raw TCPソケットなどのようなもう少し "エキゾチックな"ものを使いたい場合は、コンソールアプリケーションが必要です。 Gareth Luckettの答えが指摘するように、あなたのmain機能ブロックを確実にすることだけです。実行中のDockerコンテナは、コンテナが実行されている間、メインスレッドがブロックされることを予期します。

4

「コンソール」という用語は、ここで少し誤解を招く可能性があります。マイクロソフトはこれを使用して、WinForms、WPF、UWP、Xamarinなどの「GUI」アプリケーションやIISを介して提供されるWebアプリケーションと区別します。 ASP.NETコアアプリケーションは、Webサーバーをホストするライブラリを備えたコンソールアプリケーションです。

アプリのために、「コンソール」はあなたが望むプロジェクトタイプです。 @masonに言及されているように、Windowsサービスでさえ、単に "コンソール"アプリケーションであり、GUIアプリケーションではない.exeファイルです。

2

残念ながら、コンソールアプリケーションは実行時に標準入力を要求するため、ドッカーを介してすぐに終了します。あなたはasp.netを使ってそれを「ホスト」することができます。

public class Program 
{ 
    public static ManualResetEventSlim Done = new ManualResetEventSlim(false); 
    public static void Main(string[] args) 
    { 
     //This is unbelievably complex because .NET Core Console.ReadLine() does not block in a docker container...! 
     var host = new WebHostBuilder().UseStartup(typeof(Startup)).Build(); 

     using (CancellationTokenSource cts = new CancellationTokenSource()) 
     { 
      Action shutdown =() => 
      { 
       if (!cts.IsCancellationRequested) 
       { 
        Console.WriteLine("Application is shutting down..."); 
        cts.Cancel(); 
       } 

       Done.Wait(); 
      }; 

      Console.CancelKeyPress += (sender, eventArgs) => 
      { 
       shutdown(); 
       // Don't terminate the process immediately, wait for the Main thread to exit gracefully. 
       eventArgs.Cancel = true; 
      }; 

      host.Run(cts.Token); 
      Done.Set(); 
     } 
    }  
} 

スタートアップクラス:

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton<IServer, ConsoleAppRunner>(); 
    } 


    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
    } 
} 

ConsoleAppRunnerクラス

public class ConsoleAppRunner : IServer 
{ 

    /// <summary>A collection of HTTP features of the server.</summary> 
    public IFeatureCollection Features { get; } 

    public ConsoleAppRunner(ILoggerFactory loggerFactory) 
    { 
     Features = new FeatureCollection(); 
    } 

    /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary> 
    public void Dispose() 
    { 

    } 

    /// <summary>Start the server with an application.</summary> 
    /// <param name="application">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.Server.IHttpApplication`1" />.</param> 
    /// <typeparam name="TContext">The context associated with the application.</typeparam> 
    public void Start<TContext>(IHttpApplication<TContext> application) 
    { 
     //Actual program code starts here... 
     Console.WriteLine("Demo app running..."); 

     Program.Done.Wait();  // <-- Keeps the program running - The Done property is a ManualResetEventSlim instance which gets set if someone terminates the program. 

    } 
} 

出典:アプリケーションのhttps://stackoverflow.com/a/40549512/2238275

関連する問題