问题就如标题所问。对于数据库操作、查询、命令和事件存储,进行检查很简单,但我不知道在hostedservice上执行健康检查的最佳方式是什么。可以给出建议吗?
问题就如标题所问。对于数据库操作、查询、命令和事件存储,进行检查很简单,但我不知道在hostedservice上执行健康检查的最佳方式是什么。可以给出建议吗?
此外,根据Simon B提供的信息,这份 Microsoft 官方文档 提供了编写托管服务的健康检查结构的完整指南。
您需要三个元素:
IHostedService
接口(以及 BackgroundService
基础实现)具有可重写的方法 StartAsync()
和 StopAsync()
。
在我们的后台服务中,我们有:
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogWarning("Background service stopping");
return Task.CompletedTask;
}
HostedService
启动或停止时运行希望通知的任何内容。 public interface IHostedServiceStatus
{
bool IsHostedServiceRunning { get; set; }
}
public class HostedServiceStatus : IHostedServiceStatus
{
public bool IsHostedServiceRunning { get; set; }
}
将其设置为单例,注入到您的HostedService
中,并在StartAsync()
和StopAsync()
方法中适当地设置IsHostedServiceRunning
。
然后还要注入到您的健康检查控制器中,并读取IsHostedServiceRunning
。
/// <summary>
/// Gets the Task that executes the background operation.
/// </summary>
/// <remarks>
/// Will return <see langword="null"/> if the background operation hasn't started.
/// </remarks>
public virtual Task? ExecuteTask => _executeTask;
使用此方法,您可以推断后台服务的状态如下:
@if (service.ExecuteTask == null)
{
// Status = "Loading"
}
else
{
if(!service.ExecuteTask.IsCompleted)
{
// Status = "Running"
}
else
{
// Status = "Stopped"
}
}
或者你甚至可以使用任务的任务状态