- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已添加 Microsoft.AspNetCore.Diagnostics.HealthChecks
样式健康检查到我的应用程序为 documented by Microsoft here .
我也在用 Swashbuckle生成 swagger 文档。然后我使用 NSwag生成客户端 API 供我的其他应用程序使用。
问题是健康检查端点添加了 MapHealthChecks
在 Startup.cs 中没有被添加到 ApiExplorer
.这是一个问题,因为 Swashbuckle 使用它来生成 swagger 文档。
所以我的问题是将健康检查端点添加到 ApiExplorer 以便 Swashbuckle 可以将它包含在 swagger 文件中的最佳方法是什么?
我试图手动添加健康检查端点 add ApiExplorer(下面的代码)。应用程序运行成功,但 swagger 文档不包含端点。
// from Startup.cs
public virtual void ConfigureServices(IServiceCollection services)
{
// ...
// add swagger
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});
// add healthchecks
services
.AddHealthChecks()
.AddDbContextCheck<DatabaseDomain.DbContext>(tags: new[] { "db" })
;
// ...
}
public virtual void Configure(IApplicationBuilder app, IHostEnvironment env, IApiDescriptionGroupCollectionProvider apiExplorer)
{
// ...
app.UseEndpoints(endpoints =>
{
endpoints.
.MapHealthChecks("/healthcheck", new HealthCheckOptions
{
Predicate = _ => true, // allow all healthchecks
AllowCachingResponses = false,
// custom writer to return health check results as JSON
ResponseWriter = (context, result) => {
context.Response.ContentType = "application/json";
// serialize the health check results
var json = System.Text.Json.JsonSerializer.Serialize(new
{
// my custom response object
});
return context.Response.WriteAsync(json);
},
})
.RequireAuthorization()
;
});
// attempt to get the healthcheck endpoint to ApiExplorer
var healthcheckDescription = new ApiDescription
{
HttpMethod = "GET",
RelativePath = "/healthcheck",
};
healthcheckDescription.SupportedRequestFormats.Add(new ApiRequestFormat
{
MediaType = "application/json"
});
healthcheckDescription.SupportedResponseTypes.Add(new ApiResponseType
{
IsDefaultResponse = true,
StatusCode = (int)HttpStatusCode.OK,
ApiResponseFormats = new List<ApiResponseFormat> {
new ApiResponseFormat
{
MediaType = "application/json"
}
}
});
apiExplorer.ApiDescriptionGroups.Items.Append(new ApiDescriptionGroup("HealthCheck", new List<ApiDescription> { healthcheckDescription }));
// configure swagger
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
// ...
}
最佳答案
我最终创建了一个专门用于返回健康检查的 Controller GET api/healthchecks
.
这允许我提供有关端点返回的数据类型的信息,并控制返回数据的格式。
这是 Swagger UI 给出的示例响应:
{
"status": "string",
"totalDurationMs": 0,
"apiVersion": "string",
"apiVersionDescription": "string",
"healthChecks": [
{
"name": "string",
"status": "string",
"description": "string",
"durationMs": 0,
"tags": ["string"],
"data": [
{
"key": "string",
"value": {}
}
]
}
]
}
这是一个实际的回应:
{
"status": "Healthy",
"totalDurationMs": 82,
"apiVersion": "0.0.4-rc",
"apiVersionDescription": "0.0.3 at commit 2b188d3 [25 ahead] on branch release/0.0.4 (0.0.4-rc)",
"healthChecks": [
{
"name": "DbContext",
"status": "Healthy",
"description": null,
"durationMs": 72,
"tags": ["db"],
"data": []
}
]
}
下面是我的实现。
public virtual void ConfigureServices(IServiceCollection services)
{
// ...
// add swagger
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});
// This allows me to access the HealthCheckOptions in my controllers
services
.AddSingleton(services => new HealthCheckOptions
{
Predicate = _ => true, // allow all healthchecks
AllowCachingResponses = false,
})
;
// add healthchecks
services
.AddHealthChecks()
.AddDbContextCheck<DatabaseDomain.DbContext>(tags: new[] { "db" })
;
// ...
}
HealthCheckController.cs
Index
将响应
GET api/healthcheck
的端点.
Index
返回自定义
HealthCheckReport
对象是实际
HealthReport
的包装器目的。这使我能够控制返回的数据以及结构。我这样做是因为我想添加其他信息,例如应用程序版本和提交详细信息。
HealthReport
对象存储在
report
多变的。您需要将返回类型更改为
Task<HealthReport>
以及在
ProducesResponseType
属性。
HealthCheckService
和
HealthCheckOptions
对象。
HealthCheckService
用于生成实际报告。
HealthCheckOptions
用于访问我们在 Setup.cs 中所做的配置。
[Route("api/[controller]")]
[ApiController]
public class HealthCheckController : AppController
{
[HttpGet(Name = "Healthcheck")]
[ProducesResponseType(typeof(HealthCheckReport), (int)HttpStatusCode.OK)]
[ProducesResponseType(typeof(HealthCheckReport), (int)HttpStatusCode.ServiceUnavailable)]
public async Task<HealthCheckReport> Index(
[FromServices] HealthCheckService healthCheckService,
[FromServices] HealthCheckOptions healthCheckOptions
)
{
var report = await healthCheckService.CheckHealthAsync(healthCheckOptions.Predicate, HttpContext.RequestAborted);
Response.StatusCode = healthCheckOptions.ResultStatusCodes[report.Status];
Response.ContentType = "application/json";
// if you want you can instead return `report`, but you would
// also need to change the return type to Task<HealthReport>
// as well as the in the ProducesResponseType attributes.
return new HealthCheckReport
{
Status = report.Status.ToString(),
TotalDurationMs = report.TotalDuration.Milliseconds,
HealthChecks = report.Entries.Select(pair =>
{
var entry = pair.Value;
return new HealthCheck
{
Name = pair.Key,
Status = entry.Status.ToString(),
Description = entry.Description,
DurationMs = entry.Duration.Milliseconds,
Tags = entry.Tags,
Data = entry.Data.Select(p => new HealthCheckData { Key = p.Key, Value = p.Value }),
};
}),
};
}
}
剩余的类用于转换
HealthCheck
对象放入我想从
GET api/healthchecks
返回的数据结构中端点。
HealthCheck
序列化为 JSON,因为我想提供额外的数据。
ApiVersion
,这样我就可以知道部署了我的应用程序的哪个版本。
public class HealthCheckReport
{
public string Status { get; set; }
public int TotalDurationMs { get; set; }
public string ApiVersion => Startup.SemanticVersion;
public string ApiVersionDescription => Startup.InformationalVersion;
public IEnumerable<HealthCheck> HealthChecks { get; set; } = new HealthCheck[] { };
}
HealthCheck.cs
public class HealthCheck
{
public string Name { get; set; }
public string Status { get; set; }
public string Description { get; set; }
public int DurationMs { get; set; }
public IEnumerable<string> Tags { get; set; } = new string[] { };
public IEnumerable<HealthCheckData> Data { get; set; } = new HealthCheckData[] { };
}
HealthCheckData.cs
public class HealthCheckData
{
public string Key { get; set; }
public object Value { get; set; }
}
关于asp.net-core - 如何将健康检查端点添加到 ApiExplorer,以便 Swashbuck 将其包含在生成的 swagger.json 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63066572/
我在某处读到有一个 guiding principle将表中的行数限制在 100 万以下。我想知道这是不是真的。对于我拥有的一个项目,我将大致拥有分别包含 10,000 行、40,000 行、160,
我是一个相当新的程序员和经验丰富的运行者,一直在研究 Garmin Health API 并计划制作一个应用程序。我的第一个想法是在完成 10x400 米之后简单地获得平均时间,这是我几乎每个月都会做
for ($i=1; $i query("UPDATE `jpa` SET `war` = $b WHERE `id` = $a"); $mysqli->query("UPDATE `
我使用 Samsung S Health SDK 开发了我的应用程序。我想在我的应用程序中添加 S 健康的步行、运行和骑自行车跟踪。 如何添加这些功能? 最佳答案 我在 readTodayWalkin
到目前为止,我知道 EOF 是一个特殊字符,自动插入到文本文件的末尾以指示其结束。但我现在觉得需要对此进行更多澄清。我在 Google 和 Wikipedia 页面上查看了 EOF,但他们无法回答以下
假设我选择了一个随机来源,例如 CNN。根据关键字自动将抓取的文章分类,或者针对不同的类别抓取网站的各个部分,例如 cnn.com/tech 或/entertainment,这样会更有利吗?第二个选项
我在我的 Spring Boot + Spring Cloud 项目中使用 ConfigServer。我曾经监控端点/health,但由于 ConfigClient 在每个请求中询问 ConfigSe
对 projectname.appspot.com/_ah/health 的请求返回以下错误 { "code": 5, "message": "Method does not exist.",
我想检查我的服务的健康状况,了解每个端点的指标。我的服务调用其他一些服务并接收 Json 代码,我用它制作模板,然后将它发送到 http.ResponseWriter。 我搜索并找到了这个包“gocr
我在 javascript (React.j) 中编写了以下使用 for 循环的函数: getOpponentTeam: function(playerTeamId){ var matches =
我是 codeigniter 的新手,我想通过传递许多条件来选择用户的详细信息。我通过了一些条件,例如: $this->db->where ( 'userprofile.Disability', $
我有一个在 pm2 上运行的 nodejs 应用程序,我需要能够在发生崩溃/重启时发送电子邮件通知。我的想法是监视应用程序的崩溃并从 pm2-health 触发邮件操作。 pm2-health 模块的
我正在尝试使用 Jsoup 库(版本 1.11.3)读取域 - iv4u.health 的 URL 正文,但出现“重定向过多”错误。下面是我正在使用的代码 - public class Example
我是一名优秀的程序员,十分优秀!