В настоящее время у меня довольно большое консольное приложение, работающее с 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 (на основе учебных пособий, таких как ссылки выше). Любая помощь будет принята с благодарностью.