C# 在.NET 3.0中的辅助服务上运行ASP.NET Core
我已成功构建了一个辅助服务,并向该服务添加了ASP.NET核心API,该服务运行良好。我面临的问题是将其安装为windows服务。自从升级到.NET 3.0以来,有太多突破性的变化,尤其是C# 在.NET 3.0中的辅助服务上运行ASP.NET Core,c#,asp.net-core,.net-core-3.0,C#,Asp.net Core,.net Core 3.0,我已成功构建了一个辅助服务,并向该服务添加了ASP.NET核心API,该服务运行良好。我面临的问题是将其安装为windows服务。自从升级到.NET 3.0以来,有太多突破性的变化,尤其是HostBuilder 下面是我的程序类 public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); CreateWebHostBuilder(a
HostBuilder
下面是我的程序类
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
CreateWebHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostcontext, svc) =>
{
svc.AddHostedService<Worker>();
});
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel((context, serverOptions) =>
{
serverOptions.ListenAnyIP(1044);
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(1.5);
});
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service Starting at: {time}", DateTimeOffset.Now);
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
//Run a request
}
catch (Exception ex)
{
_logger.LogError(ex.InnerException.ToString());
}
_logger.LogInformation("Salesforce Service running at: {time}", DateTimeOffset.Now);
await Task.Delay(2500, stoppingToken);
}
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service Stop at: {time}", DateTimeOffset.Now);
return base.StopAsync(cancellationToken);
}
public override void Dispose()
{
_logger.LogInformation("Resources released at: {time}", DateTimeOffset.Now);
base.Dispose();
}
}
和我的工人阶级
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
CreateWebHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices((hostcontext, svc) =>
{
svc.AddHostedService<Worker>();
});
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel((context, serverOptions) =>
{
serverOptions.ListenAnyIP(1044);
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(1.5);
});
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service Starting at: {time}", DateTimeOffset.Now);
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
//Run a request
}
catch (Exception ex)
{
_logger.LogError(ex.InnerException.ToString());
}
_logger.LogInformation("Salesforce Service running at: {time}", DateTimeOffset.Now);
await Task.Delay(2500, stoppingToken);
}
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service Stop at: {time}", DateTimeOffset.Now);
return base.StopAsync(cancellationToken);
}
public override void Dispose()
{
_logger.LogInformation("Resources released at: {time}", DateTimeOffset.Now);
base.Dispose();
}
}
我设法解决了这个问题,并在我的机器上本地部署了服务;结果是包裹被分开了,也就是说
Microsoft.AspNetCore.Hosting.WindowsServices
和Microsoft.Extensions.Hosting.WindowsServices
所以我所要做的就是添加包并重构程序.cs
,如下所示
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().RunAsService();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
.UseStartup<Startup>()
.UseKestrel((context, serverOptions) =>
{
serverOptions.ListenAnyIP(1044);
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(1.5);
});
publicstaticvoidmain(字符串[]args)
{
CreateWebHostBuilder(args.Build().RunAsService();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseContentRoot(路径.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
.UseStartup()
.UseKestrel((上下文,服务器选项)=>
{
serverOptions.ListenyIP(1044);
serverOptions.Limits.KeepAliveTimeout=TimeSpan.FromMinutes(1.5);
});
有关更多上下文,请参见此错误消息将非常有用。什么是目录。GetCurrentDirectory()?如果它是一个配置文件目录(`C:\Users\xxx\yyy`),那么它就不能工作,windows服务通常不运行配置文件(例如网络服务组)。我已经尝试过了,我收到了这个错误
[SC]StartService失败1053:该服务未及时响应启动或控制请求。
尝试启动该服务时,我的意思是来自.NET核心应用程序的错误消息。该应用程序在调试模式下运行正常,我怀疑在部署时出现错误,即[SC]StartService失败1053:
是由于WebHostBuilder中缺少UseWindowsService
注入造成的。这是真的吗?您还可以解决向发布配置文件添加自包含方法的问题,感谢您提供的解决方案。