我在ASP中添加了健康检查。. NET Core 6应用程序,一切正常运行。
我需要(在运行时以编程方式)确定所有健康检查路由,例如/healthz
等。
我试着:
// inject IEnumerable<EndpointDataSource>
// ...
var routes = _endpointDataSources.SelectMany(source => source.Endpoints);
但是,如果不使用hack或魔法字符串,我就无法选择正确的端点(使用linq)。健康检查端点以"Heath checks"
作为其显示名称,但我假设可以随时更改,因此它不可靠。
我如何以可靠的方式获得这些端点,而不会在下一次更新时中断?
健康检查(目前)是通过创建中间件管道和映射结果委托来实现的,其显示名称为"Health checks"
。
var pipeline = endpoints.CreateApplicationBuilder()
.UseMiddleware<HealthCheckMiddleware>(args)
.Build();
return endpoints.Map(pattern, pipeline)
.WithDisplayName(DefaultDisplayName);
正如您所发现的,您应该能够发现所有端点,搜索任何运行状况检查,并通过;
列出它们的路径。var sources = provider.GetService<IEnumerable<EndpointDataSource>>(); // via DI
var routes = sources
.SelectMany(s => s.Endpoints)
.OfType<RouteEndpoint>()
.Where(e => e.DisplayName == "Health checks")
.Select(e => e.RoutePattern)
.ToList();
所以回答你的实际问题,虽然你将用来配置端点路由的方法不太可能改变。文档中提到了如何检查端点路由元数据。但我不指望将来会得到强有力的支持。