web-dev-qa-db-ja.com

Windowsサービスとしての.NET Core 3.1コンソールアプリ

私は現在、ASP.NETコア3.1で実行されているかなり大きなコンソールアプリを持っています。ウィンドウサービスとしてのサーバーの1つにこの作品を作るようになったと任務が課されています。私はそれをサーバー自体のサービスとして実行する準備ができていますが、現時点で私が立ち往生しているのは、それを壊すことなくサービスとして実行させるために実際にコードでそれを変更する方法です。

私は この のようなチュートリアルの数をいくつか見つかりましたが、サービスとしてコンソールアプリを実行する方法を説明していますが、それらのすべてが新鮮なプロジェクトから開始したことがわかりました。私の問題は、私の現在のプロジェクトがすでに書かれているということです。私が助けを求めている主な問題は、現在Startup.csにある機能を保持しながら、プロジェクトをWindowsサービスとして機能させることについてどのようにして行くのでしょうか。コンテキストの場合は、ここに現在のstartup.csとprogram.csがあります。

startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddSignalR();
        services.AddTransient<SharePointUploader>();
        services.AddTransient<FileUploadService>();
        services.AddSingleton<UploaderHub>();
        //services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
        services.AddAuthorization();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHttpsRedirection();
        }

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<UploaderHub>("/uploadHub");
        });
    }
}
 _

program.cs

public class Program
{
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
        try
        {
            logger.Debug("init main");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception exception)
        {
            //NLog: catch setup errors
            logger.Error(exception, "Stopped program because of exception");
            throw;
        }
        finally
        {
            // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
            NLog.LogManager.Shutdown();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(LogLevel.Trace);
            })
            .UseNLog();
}
 _

これがWindowsサービスとして実行されると、(上記のようなチュートリアルに基づいて)機能がどのように機能するかどうかは本当にわかりません。あらゆる助けが大いに感謝されるでしょう。

6
Brade

私の場合、私は私のホストビルダーの設定に含まれている "usewindowsservice()"ステートメントを持っていました。しかし、私はその構成が複数の行に分解され、問題は、開発中のある時点で、私は[〜#〜] A:

USECONSOLELIFETIME()

コード内でさらに混在するという文。何が起こっていたのかを考え出したら、次の部分コードブロックを使用して問題を解決しました。

        var hostBuilder = Host.CreateDefaultBuilder(args);
        if (WindowsServiceHelpers.IsWindowsService())
        {
            hostBuilder.UseWindowsService();
        }
        else
        {
            hostBuilder.UseConsoleLifetime();
        }
 _

注意WindowsServiceHelpersは、 "Microsoft.Extensions.hosting.WindowsServices"名前空間の静的クラスです。

0
Paul Schroeder