. NET Консольное приложение Core 3.1 в качестве службы Windows - PullRequest
2 голосов
/ 27 февраля 2020

В настоящее время у меня довольно большое консольное приложение, работающее с ASP. NET Core 3.1. Мне было поручено сделать эту работу на одном из наших серверов в качестве службы Windows. У меня все готово, чтобы он работал как служба на самом сервере, однако одна вещь, на которой я сейчас застрял, это то, как на самом деле изменить его в коде, чтобы он работал как служба, не прерывая его.

Я нашел пару учебных пособий, таких как this , которые объясняют, как запускать консольное приложение как службу, однако все они, как я обнаружил, начинаются с проекта fre sh. Моя проблема в том, что мой текущий проект уже написан. Моя основная проблема, с которой я обращаюсь за помощью, заключается в том, как бы я go заставил мой проект работать в качестве windows службы, сохраняя при этом функциональность, которая в настоящее время находится в файле startup.cs. Для контекста, вот мои текущие 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 (на основе учебных пособий, таких как ссылки выше). Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...