运行状况检查用于确定应用程序是否正常响应请求。 ASP.Net Core为运行状况检查提供了支持,以使用运行状况检查中间件报告应用程序的运行状况,该中间件是ASP.Net Core 2.2中引入的。
ASP.Net Core中的运行状况检查作为HTTP终结点公开,并且可以配置。 您可以使用运行状况检查对活动性进行基本检查,检查系统或网络资源,检查数据库是否正在响应,或者检查其他依赖项,例如消息代理或Azure云服务。 本文讨论了如何在ASP.Net Core中使用运行状况检查中间件。
在Visual Studio中创建一个ASP.Net Core项目
首先,让我们创建一个ASP.Net Core项目。 如果您的系统已启动并运行Visual Studio 2017,请按照以下步骤在Visual Studio中创建一个新的ASP.Net Core项目。
- 启动Visual Studio 2017 IDE。
- 单击文件>新建>项目。
- 从显示的模板列表中选择“ ASP.Net Core Web应用程序(.Net Core)”。
- 指定项目的名称。
- 单击确定保存项目。
- 接下来显示一个新窗口“ New .Net Core Web Application…”。
- 选择.Net Core作为运行时,并从顶部的下拉列表中选择ASP.Net Core 2.2(或更高版本)。
- 选择API作为项目模板。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保选择“无身份验证”,因为我们也不会使用身份验证。
- 单击确定。
这将在Visual Studio中创建一个新的ASP.Net Core项目。 我们将在本文的后续部分中使用该项目。
在ASP.Net Core中注册运行状况检查服务
若要注册运行状况检查服务,应在Startup类的ConfigureServices方法中调用AddHealthChecks方法。 接下来,您应该通过调用UseHealthChecks来添加运行状况检查中间件,如下面的代码片段所示。
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health");
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
请注意,运行时将调用ConfigureServices和Configure方法。
ASP.Net Core中的内置运行状况检查
您可以利用内置的Entity Framework Core DbContext运行状况检查来报告Entity Framework Core DbContext是否能够连接到数据库。 为此,您应该添加Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore NuGet程序包,并在ConfigureServices方法中配置运行状况检查,如下所示。
services.AddHealthChecks().AddDbContextCheck<MyDbContext>
("IDGDbContextHealthCheck");
如果需要,您还可以利用NuGet中提供的其他运行状况检查程序包。 这些包括SQL Server,MySQL,MongoDB,Redis,RabbitMQ,Elasticsearch,Hangfire,Kafka,Oracle,Azure存储等。 这些社区软件包可从GitHub上的AspNetCore.Diagnostics.HealthChecks存储库中获得 。
在ASP.Net Core中创建自定义运行状况检查
例如,您可以构建自定义运行状况检查以验证和报告应用程序是否无法连接到数据库或外部服务。 若要创建自定义运行状况检查,应扩展IHealthCheck接口并实现CheckHealthAsync方法。
public class MyCustomHealthCheck : IHealthCheck
{
public Task<HealthCheckResult>
CheckHealthAsync(HealthCheckContext context,
CancellationToken cancellationToken =
default(CancellationToken))
{
throw new System.NotImplementedException();
}
}
这是实现CheckHealthAsync方法的方法。 请注意如何在此方法中使用HealthCheckResult结构。
public async Task<HealthCheckResult>
CheckHealthAsync(HealthCheckContext context,
CancellationToken cancellationToken =
default(CancellationToken))
{
bool canConnect = IsDBOnline();
if (canConnect)
return HealthCheckResult.Healthy();
return HealthCheckResult.Unhealthy();
}
IsDBOnline方法检查数据库是否已启动并正在运行。
private bool IsDBOnline()
{
string connectionString =
"some connection string to connect to the database";
try
{
using (SqlConnection connection = new
SqlConnection(connectionString))
{
if (connection.State !=
System.Data.ConnectionState.Open)
connection.Open();
}
return true;
}
catch (System.Exception)
{
return false;
}
}
这是完整的代码清单,供您参考。
using Microsoft.Extensions.Diagnostics.HealthChecks;
using System.Threading;
using System.Threading.Tasks;
namespace IDGHealthCheckApp
{
public class MyCustomHealthCheck : IHealthCheck
{
public async Task<HealthCheckResult>
CheckHealthAsync(HealthCheckContext context,
CancellationToken cancellationToken =
default(CancellationToken))
{
bool canConnect = IsDBOnline();
if (canConnect)
return HealthCheckResult.Healthy();
return HealthCheckResult.Unhealthy();
}
private bool IsDBOnline()
{
string connectionString =
"some connection string to connect to the database";
try
{
using (SqlConnection connection = new
SqlConnection(connectionString))
{
if (connection.State !=
System.Data.ConnectionState.Open)
connection.Open();
}
return true;
}
catch (System.Exception)
{
return false;
}
}
}
}
上面的代码片段中显示的HealthCheckResult对象使我们可以传递表示为键值对字典的描述,异常和状态数据。 然后可以在健康检查网页中显示此信息。 构建自定义运行状况检查后,应在Startup类的ConfigureServices和Configure方法中适当配置自定义运行状况检查类型,以开始利用它。
在ASP.Net Core中可视化运行状况检查
如果您想以更好的方式可视化运行状况检查,则可以利用名为HealthChecksUI的开源可视化工具。 要使用此工具,请在程序包管理器控制台窗口中使用以下命令从NuGet安装它。
Install-Package AspNetCore.HealthChecks.UI
安装软件包后,应在Startup类的ConfigureServices和Configure方法中对其进行配置。
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecksUI();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions
{
Predicate = _ => true,
ResponseWriter =
UIResponseWriter.WriteHealthCheckUIResponse
});
app.UseHealthChecksUI();
}
那不是全部。 您还应该在appsettings.json文件中添加以下配置,以使HealthChecksUI知道从何处获取健康检查信息。
"HealthChecks-UI": {
"HealthChecks": [
{
"Name": "Local",
"Uri": "http://localhost:1994/health"
}
],
"EvaluationTimeOnSeconds": 10,
"MinimumSecondsBetweenFailureNotifications": 60
}
最后,启动您的应用程序并导航到/ healthchecks-ui以监视其运行状况。
运行中的HealthChecksUI。
ASP.Net Core中的运行状况检查中间件使添加和配置系统资源,数据库以及应用程序依赖的其他服务的运行状况检查变得容易。 由您决定什么被认为是健康的,哪些被认为是不健康的,并配置健康检查端点应如何响应。 当运行状况检查失败时,例如当您的应用程序无法连接到数据库时,您甚至可以发出失败通知。
From: https://www.infoworld.com/article/3379187/how-to-implement-health-checks-in-aspnet-core.html