[英]ASP.NET Core Health checks in multi tenant environment using routing configuration
我開始使用來自Asp.net Core的運行狀況檢查,我喜歡它們,但是我找不到一種簡單的方法將其與基於租戶的路由連接起來,例如支持:
如果我成功采用了這種方法,則可以使用標簽來過濾要使用的運行狀況檢查,但是不幸的是,我無法為請求配置路由。
app.UseEndpointRouting();
app.UseHealthChecks("/{tenant}/health", new HealthCheckOptions
{
ResponseWriter = WriteCustomHealthResponse,
AllowCachingResponses = false,
Predicate = _ => _.Tags.Contains("tenant-specific")
});
上面的代碼未正確路由。 我探索了使用如下所示的可能性:
app.MapWhen(context =>
context.Request.Method == HttpMethod.Get.Method &&
context.Request.?ROUTEDATA?.SOMECHECK("/{tenant}/HealthCheck"),
builder => builder.UseHealthChecks());
但是在這種情況下,我無法檢查路由是否正確。
到目前為止,我找到的解決方案是使用查詢字符串參數並使用IHttpContextAccessor
搜索承租人參數。 為此,我創建了IHealthCheck
的基本抽象實現。
public abstract class BaseTenantHealthCheck : IHealthCheck
{
private IHttpContextAccessor _httpContextAccessor;
public BaseTenantHealthCheck(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected string GetTenant()
{
return _httpContextAccessor?.HttpContext?.Request?.Query["tenant"].ToString();
}
protected bool IsTenantSpecificCheck() => !string.IsNullOrEmpty(GetTenant());
public abstract Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context,
CancellationToken cancellationToken = default(CancellationToken));
}
然后在實現類中,傳遞如下所示的上下文訪問器。
public class MylAvailabilityHealthCheck : BaseTenantHealthCheck
{
public MyAvailabilityHealthCheck(IOptionsMonitor<MyAvailabilityCheckOptions> options, IHttpContextAccessor httpContextAccessor)
: base(httpContextAccessor)
{
[..]
要使用健康檢查,我使用:
http://{url}/health
[用於多租戶檢查] http://{url}/health?tenant=TenantName
[用於特定於租戶的檢查] 我期待聽到是否有更優雅的方法可以做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.