#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?