C# 在.NET 3.0中的辅助服务上运行ASP.NET Core

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

我已成功构建了一个辅助服务,并向该服务添加了ASP.NET核心API,该服务运行良好。我面临的问题是将其安装为windows服务。自从升级到.NET 3.0以来,有太多突破性的变化,尤其是
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
注入造成的。这是真的吗?您还可以解决向发布配置文件添加自包含方法的问题,感谢您提供的解决方案。