gpt4 book ai didi

c# - .NET Core 3.1 控制台应用作为 Windows 服务

转载 作者:行者123 更新时间:2023-12-03 14:07:50 28 4
gpt4 key购买 nike

我目前有一个运行 ASP.NET Core 3.1 的相当大的控制台应用程序。我现在的任务是在我们的一台服务器上将这项工作作为窗口服务进行。我已经准备好让它在服务器本身上作为服务运行,但是,我目前遇到的一件事是如何在代码中实际更改它以使其作为服务运行而不会破坏它。
我找到了几个教程,如 this这确实解释了如何将控制台应用程序作为服务运行,但是,我发现的所有这些都从一个新项目开始。我的问题是我当前的项目已经写好了。我寻求帮助的主要问题是如何让我的项目作为 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");
});
}
}
程序.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 服务运行时应该如何工作(基于上面链接的教程)。任何帮助将不胜感激。

最佳答案

使用 IWebHostBuilder 而不是 IHostBuilder:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
// Configure the app here.
})
.UseNLog()
.UseUrls("http://localhost:5001/;" +
"https://localhost:5002/;")
.UseStartup<Startup>();

您还需要以下软件包:
Microsoft.AspNetCore.Hosting;
Microsoft.AspNetCore.Hosting.WindowsServices;

修改你的主函数:
bool isService = !(Debugger.IsAttached || args.Contains("--console"));
var builder = CreateWebHostBuilder(args.Where(arg => arg != "--console").ToArray());
var host = builder.Build();

if (isService)
{
host.RunAsService();
}
else
{
host.Run();
}

要安装服务,请使用工具 sc.exe。您可以通过将 --console 作为参数传递给应用程序来将应用程序作为控制台应用程序运行。对于调试,您还需要传递 --console 。

关于c# - .NET Core 3.1 控制台应用作为 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60426202/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com