微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何强制服务在Web API中运行

如何解决如何强制服务在Web API中运行

我有一个Web api项目。在services.cs类中,我要求它运行2个服务,然后只有它才能启动程序。

所以我的Web 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));
                        }
}

所以,即使程序尝试打到Worker类A中的外部链接,并且如果程序无法尝试,它仍会继续尝试,该如何启动程序。我希望它启动程序,然后继续尝试启动该服务。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。