Запуск ASP.NET Core на рабочем сервисе в .NET 3.0 - PullRequest
0 голосов
/ 04 ноября 2019

Мне удалось создать рабочую службу и добавить к ней ASP.NET Core API, которая работает нормально. Проблема, с которой я сталкиваюсь, заключается в установке его в качестве службы Windows. Начиная с обновления до .NET 3.0, существует так много критических изменений, особенно с HostBuilder

Ниже мой Program class

 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);
                });

Когда я запускаю его так, он не может выбратьWebHost Builder, и когда я запускаю только с помощью WebHost Builder, он не может установить службу на конечном сервере.

Пожалуйста, помогите Я хотел бы использовать преимущества IWebHostBuilder и IHostBuilder, но я не знаю, как их объединить в методе static main.

Ниже приведены другиефайлы;

StartUp

 public void ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection services)
        {
            services.AddHostedService<Worker>();

            ////Add Controllers
            //services.AddTransient<SalesForceDataLoaderController>();


            //Add DB Dependency Injection
            services.AddAutoMapper(typeof(Startup));

            services.AddMvc().AddJsonOptions(options =>
            {
                options.UseCamelCasing(true);
            }).AddControllersAsServices();
            services.AddDbContext<SalesForceReportLoaderContext>(options =>
                options.UseSqlServer(this.APIdb));

            services.AddScoped<IRepositoryWrapper, RepositoryWrapper>();
            services.AddScoped<ILogger, Logger<SalesForceDataLoaderController>>();
            services.AddScoped<ILogger, Logger<ActisureWhatsAppController>>();
            services.AddScoped<ILogger, Logger<PureWhatsAppController>>();

            services.AddSingleton(typeof(IRepository<>), typeof(Repository<>));
            services.AddSingleton<ISalesforceLoaderRepository, SalesforceLoaderRepository>();
            services.AddSingleton<IActWhatsAppClaimStatusRepo, ActWhatsAppClaimStatusRepo>();
            services.AddSingleton<IPureWhatsAppClaimStatusRepo, PureWhatsAppClaimStatusRepo>();
            services.AddSingleton<IPureWhatsAppPolicyDetailsRepo, PureWhatsAppPolicyDetailsRepo>();


        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc();
            //app.UseRouting();

        }

и мои worker class

 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();
        }
    }

РЕДАКТИРОВАТЬ

Я теперь установил службу нормально, используя svc но я получаю эту ошибку

[SC] StartService FAILED 1053:

The service did not respond to the start or control request in a timely fashion.

1 Ответ

0 голосов
/ 05 ноября 2019

Мне удалось решить проблему и развернуть сервис локально на моей машине;оказывается, пакеты были отделены, то есть;Microsoft.AspNetCore.Hosting.WindowsServices и Microsoft.Extensions.Hosting.WindowsServices

Итак, все, что мне нужно было сделать, это добавить пакет и изменить program.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);
                });

Для получения дополнительной информации см. ссылка

...