【问题标题】:How to an API periodically to receive service health status in Asp.net Core如何让 API 定期接收 Asp.net Core 中的服务健康状态
【发布时间】:2021-12-21 03:23:38
【问题描述】:

我有一个场景,我必须定期调用 API 来接收健康状态。

如果我使用一段时间会怎样?

 while (true)
  {
// API call
   var health = _client.GetHealth(1).Result;
   if (health)
     {
       some other work

     }
   Thread.Sleep(2000);
  }

【问题讨论】:

  • 一般来说,睡眠循环很少是一个好的解决方案。你可能想看看某种timer
  • 首先,这是通过Health Checks 开箱即用的。其次,您不能只在控制器中创建睡眠循环或计时器。创建控制器实例是为了服务单个请求,最终将被垃圾收集。对于长时间运行的作业,您需要一个 BackgroundService。最后,Thread.Sleep 永远不应该在 Web 应用程序中使用。至少使用Task.Delay
  • 您可以使用hosted service,它在.net core 中可用。
  • @PanagiotisKanavos 我没有在 Controller 中调用这个 API
  • @RabnerCasandara 在这种情况下,您将不得不解释您真正想要什么。你在哪里叫它?实际的问题是什么?你为什么问这段代码是否可以? (不是,不要用.Result)

标签: c# asp.net-core asp.net-web-api health-check


【解决方案1】:

这已通过Health Checks middleware 提供。健康检查服务会定期检查注册的探针,看看是否一切正常。可以通过 API 端点记录或公开健康状态。

有几个可用的探针。开源的AspNetCore.Diagnostics.HealthChecks 库提供了从远程 API 到各种数据库产品、云服务等的一切探测。它还提供了一个健康检查仪表板,可显示详细的健康检查历史记录。

使用健康检查很容易,因为它已经包含在网络应用模板中。

注册它需要将以下内容添加到Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks();
}

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHealthChecks("/health");
    });
}

MapHealthChecks/health 端点公开基本状态。要检查远程 API,您可以添加 AspNetCore.HealthChecks.Uris 包并使用 AddUrlGroup 重载之一:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks()
            .AddUrlGroup(new Uri("http://httpbin.org/status/200"));
}

【讨论】:

  • 没有Health Check中间件如何实现
  • @RabnerCasandara 为什么?为什么要复制已经可用并且可以正常工作的东西?你的实际问题是什么?此外,我已经在 cmets 中回答说,开箱即用定期执行工作的唯一方法是使用 BackgroundService
  • 我的 GetHealth 方法正在调用 REST 端点来检查 API 运行状况
  • 我刚刚发布的示例也是如此。您的问题被严重否决,因为不清楚您想要什么。
【解决方案2】:

你可以使用异步编程,

public async Task HealthCheckAsync()
{
 while (true)
  {
// API call
   var health = await _client.GetHealth(1);
   if (health)
     {
       some other work

     }
    await Task.Delay(2000);
  }
}

除了在等待来自服务器的响应或等待下一个周期时它不会阻塞主线程之外,它的工作方式相同。

【讨论】:

  • 这不起作用的原因与Thread.Sleep 不起作用的原因相同。控制器操作仅适用于短期请求,最终将被 GCd 或抛出超时。此外,ASP.NET Core 中内置了健康检查
  • 我相信他正在寻找健康检查客户。在这种情况下,它可以工作。它不一定是控制器动作,它可以是一个独立的控制台应用程序。
猜你喜欢
  • 2021-01-14
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2016-07-09
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多