Как заставить службу запускаться в web api

#c# #asp.net-core-webapi

#c# #asp.net-core-webapi

Вопрос:

У меня есть проект веб-api. В классе services.cs я прошу его запустить 2 службы, и только тогда он запустит программу.

Итак, мой веб-api переходит по внешней ссылке, и если эта ссылка недоступна, то моя служба не запускается, потому что в нее встроен код, и он продолжает повторять попытки, пока ссылка не будет установлена.

Теперь мне нужен механизм, в котором, даже если внешняя ссылка отключена, я хочу, чтобы служба запускалась и продолжала пытаться запустить этот класс, пока ссылка не будет установлена, но программа должна быть запущена.

Ниже приведен код в моем файле startup.cs

  public void ConfigureServices(IServiceCollection services)
        {
            
            services.AddControllers(ConfigureControllers)
                .AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.PropertyNamingPolicy = null; // use PascalCase
                    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
                });

            services.AddHostedService<WorkerClassA>();
            services.AddHostedService<WorkerClassB>();
        }
  

код в рабочем классе a:

  public WorkerClassA(IServiceScopeFactory scopeFactory, ILogger<WorkerClassA> logger, CacheRefreshConfig cacheRefreshConfig)
        {
            _scopeFactory = scopeFactory;
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _cacheRefreshConfig = cacheRefreshConfig;
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("iLevel Refresh cache background service is stopped.");
            return base.StopAsync(cancellationToken);
        }

        public override async Task StartAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("iLevel Refresh cache background service has started.");
            await RefreshCache();
            await base.StartAsync(cancellationToken);
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                await Task.Delay(AppSettings.Current.CacheRefreshDelay, stoppingToken);
                await RefreshCache();
            }
        }
  public async Task RefreshCache()
        {
    try
                        {
                            using var scope = _scopeFactory.CreateScope();
                            var cache = scope.ServiceProvider.GetService<CacheService>();
                            await referenceDataService.LoadReferenceDataFromexternallink();
                            _logger.LogInformation("Cache refreshed successfully");
                            return;
                        }
                        catch (Exception ex)
                        {
                            
                            if (isExceptionLogEnabled)
                            {
                                _logger.LogError(ex, "Failed to refresh cache");
                                isExceptionLogEnabled = false;
                            }
                            await Task.Delay(TimeSpan.FromSeconds(1));
                        }
}
  

Итак, как мне запустить программу, даже если она пытается перейти по внешней ссылке в рабочем классе A, и если это не удается, она просто продолжает повторять попытку. Я хочу, чтобы он запустил программу, а затем продолжал пытаться попасть в службу.

Комментарии:

1. Это помогло бы увидеть, как написан WorkerClassA.

2. @ADyson я добавил код в вопрос

3. @Fildor добавил полный код.

4. @Fildor я хочу сделать это только в том случае, если он входит в блок catch. В противном случае ему нужно подождать, пока появятся данные

5. @Fildor Извините, я не уверен, как это сделать. Итак, когда дело доходит до catch, как мне это сделать. Например, какие изменения я должен внести в executeasyn?