Microsoft がここで文書化しMicrosoft.AspNetCore.Diagnostics.HealthChecks
ているように、アプリケーションにスタイル ヘルス チェックを追加しました。
また、Swashbuckle を使用して、 swaggerドキュメントを生成しています。次に、NSwagを使用して、他のアプリケーションが使用するクライアント API を生成します。
問題はMapHealthChecks
、Startup.csで追加されたヘルスチェック エンドポイントが に追加されていないことApiExplorer
です。Swashbuckle が swagger ドキュメントを生成するために使用するものであるため、これは問題です。
Swashbuckle が swagger ファイルに含めることができるように、healthcheck エンドポイントを ApiExplorer に追加する最良の方法は何ですか?
ヘルス チェック エンドポイント 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");
});
// ...
}