Asp.Net Core中如何每30分钟递归调用自有API?
在Asp.Net Core中实现每30分钟触发状态重传的方案
针对你的场景,完全可以在Asp.Net Core中实现定时触发数据重传,下面是几种实用方案:
方案一:直接调用业务逻辑(推荐)
你的API接口本质上只是调用_arribaDBService.TransferAppStatusData2(),没必要绕HTTP请求,直接在后台定时任务里调用这个服务方法更高效,还能避免API授权、网络请求等额外开销。
步骤如下:
- 创建后台服务类:
public class AppStatusTransferService : BackgroundService { private readonly IServiceScopeFactory _scopeFactory; private readonly PeriodicTimer _timer; public AppStatusTransferService(IServiceScopeFactory scopeFactory) { _scopeFactory = scopeFactory; // 每30分钟触发一次 _timer = new PeriodicTimer(TimeSpan.FromMinutes(30)); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested && await _timer.WaitForNextTickAsync(stoppingToken)) { try { using var scope = _scopeFactory.CreateScope(); var arribaDBService = scope.ServiceProvider.GetRequiredService<IArribaDBService>(); // 直接调用业务方法 await arribaDBService.TransferAppStatusData2(); } catch (Exception ex) { // 这里添加日志记录,比如用ILogger // _logger.LogError(ex, "定时传输应用状态数据失败"); } } } public override void Dispose() { _timer.Dispose(); base.Dispose(); } }
- 在Program.cs注册后台服务:
builder.Services.AddHostedService<AppStatusTransferService>();
方案二:通过HTTP调用自身API(特殊场景用)
如果因为某些限制必须走API接口,比如需要触发API的拦截器、日志等逻辑,可以在后台服务里用HttpClient调用:
- 注册HttpClient:
builder.Services.AddHttpClient();
- 修改后台服务类:
public class AppStatusTransferApiService : BackgroundService { private readonly HttpClient _httpClient; private readonly PeriodicTimer _timer; private readonly string _apiUrl = "/api/transfer-app-status"; // 替换成你的实际路由 public AppStatusTransferApiService(HttpClient httpClient) { _httpClient = httpClient; _timer = new PeriodicTimer(TimeSpan.FromMinutes(30)); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested && await _timer.WaitForNextTickAsync(stoppingToken)) { try { var response = await _httpClient.PostAsync(_apiUrl, null, stoppingToken); response.EnsureSuccessStatusCode(); // 确保请求成功,失败会抛异常 } catch (Exception ex) { // 日志记录异常 } } } public override void Dispose() { _timer.Dispose(); base.Dispose(); } }
- 同样在Program.cs注册这个服务:
builder.Services.AddHostedService<AppStatusTransferApiService>();
补充说明
- 如果部署在Linux服务器,也可以用Cron定时任务调用你的API,但Asp.Net Core自带的后台服务更集成化,不用依赖外部工具。
- 定时任务的异常处理一定要加,避免单次执行失败导致整个后台服务终止。
- 如果你的
IArribaDBService是Scoped生命周期,必须用IServiceScopeFactory创建作用域来获取实例,不能直接注入,因为后台服务是Singleton。
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

