You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asp.Net Core中如何每30分钟递归调用自有API?

在Asp.Net Core中实现每30分钟触发状态重传的方案

针对你的场景,完全可以在Asp.Net Core中实现定时触发数据重传,下面是几种实用方案:

方案一:直接调用业务逻辑(推荐)

你的API接口本质上只是调用_arribaDBService.TransferAppStatusData2(),没必要绕HTTP请求,直接在后台定时任务里调用这个服务方法更高效,还能避免API授权、网络请求等额外开销。

步骤如下:

  1. 创建后台服务类:
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();
    }
}
  1. 在Program.cs注册后台服务:
builder.Services.AddHostedService<AppStatusTransferService>();

方案二:通过HTTP调用自身API(特殊场景用)

如果因为某些限制必须走API接口,比如需要触发API的拦截器、日志等逻辑,可以在后台服务里用HttpClient调用:

  1. 注册HttpClient:
builder.Services.AddHttpClient();
  1. 修改后台服务类:
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();
    }
}
  1. 同样在Program.cs注册这个服务:
builder.Services.AddHostedService<AppStatusTransferApiService>();

补充说明

  • 如果部署在Linux服务器,也可以用Cron定时任务调用你的API,但Asp.Net Core自带的后台服务更集成化,不用依赖外部工具。
  • 定时任务的异常处理一定要加,避免单次执行失败导致整个后台服务终止。
  • 如果你的IArribaDBService是Scoped生命周期,必须用IServiceScopeFactory创建作用域来获取实例,不能直接注入,因为后台服务是Singleton。

内容的提问来源于stack exchange,提问作者Prosy A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:38:28