ASP.NETコアWebアプリケーションとコンソールアプリケーションの2種類の.NETコアプロジェクトが表示されます。私は、Docker環境(Linuxコンテナ)にWindowsサービスのようなものを構築したいと思います。そこでは、プロセスが開始され、無期限に実行され、指示されたときにのみ停止します。いずれのプロジェクトタイプも適切ではないようです。何か不足していますか?Linuxドッカーコンテナを対象とした長期実行.NETコアサービスの作成
答えて
どちらのタイプには理にかなって、それはあなたがと通信を計画してどのように依存しますこのサービス。
一部のTCPポートで標準HTTP経由で通信する場合は、ASP.NetコアWebアプリケーションを使用すると作業が簡単になります。
RabbitMQ、Kafka、raw TCPソケットなどのようなもう少し "エキゾチックな"ものを使いたい場合は、コンソールアプリケーションが必要です。 Gareth Luckettの答えが指摘するように、あなたのmain
機能ブロックを確実にすることだけです。実行中のDockerコンテナは、コンテナが実行されている間、メインスレッドがブロックされることを予期します。
「コンソール」という用語は、ここで少し誤解を招く可能性があります。マイクロソフトはこれを使用して、WinForms、WPF、UWP、Xamarinなどの「GUI」アプリケーションやIISを介して提供されるWebアプリケーションと区別します。 ASP.NETコアアプリケーションは、Webサーバーをホストするライブラリを備えたコンソールアプリケーションです。
アプリのために、「コンソール」はあなたが望むプロジェクトタイプです。 @masonに言及されているように、Windowsサービスでさえ、単に "コンソール"アプリケーションであり、GUIアプリケーションではない.exeファイルです。
残念ながら、コンソールアプリケーションは実行時に標準入力を要求するため、ドッカーを介してすぐに終了します。あなたは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
- 1. 異なるLinuxディストリビューションを対象としたQtアプリケーションの作成
- 2. Windowsドッカーコンテナ対Linuxドッカーコンテナ
- 3. .NET/Windows Formsで長期実行アクションを実行するためのライブラリ?
- 4. C実行可能ファイル、管理対象COM dll、.Net GUIのマージ
- 5. .Netの管理対象リソースと非管理対象リソース
- 6. MACでCoreとFull .NETの両方を対象とした.NETコアを構築
- 7. XamarinフォームNET対象
- 8. 長期実行操作のシミュレーション
- 9. TeamCityの新しい.NET Core * .csprojを対象としたxUnitテストの実行方法?
- 10. .NET Publisherポリシーの対象フレームワーク
- 11. ユーザーとドッカーコンテナの実行
- 12. SDL Tridion 2011 SP1のコアサービスを使用したスキーマの作成
- 13. Bash:ループの実行対象をランダム化したい
- 14. 長期実行タスクの実行方法
- 15. スケジュール対象の実行中のファイル
- 16. 対象.NETコアクラスライブラリ.NET Framework 4.6.2クラスライブラリ
- 17. Linux対Windows:実行速度
- 18. デルタ同期の対象となるデータベーススキーマ
- 19. ASP.NET MVC 3とJQueryの長期実行操作
- 20. 作成したドッカークラスタークラスタに対して "docker run"を実行
- 21. LinuxホストでWindowsドッカーコンテナを実行するには?
- 22. 長い実行時間のlinux
- 23. 長期実行タスクとスレッド - パフォーマンス
- 24. C#gcnewオブジェクトと長期実行SQLクエリ
- 25. 対象:SSISDBの実行とイベントメッセージとSSISパッケージのログ?
- 26. Amazonでの.NETプログラムの実行Linux AMI
- 27. aws codeseploy長期実行プロセス
- 28. 対象行Javadoc
- 29. Linuxで.NETエグゼを実行する
- 30. MOSS公開インフラストラクチャを使用した長期実行操作のサポート
Windowsサービスは、基本的にはサービスマネージャによって開始/停止されるコンソールアプリケーションです。 – mason