[英]Referencing non-static method in a static way
我有這個 C# class:
public static class HealthCheckHighMark
{
public static IEndpointConventionBuilder MapHighMarkChecks(
this IEndpointRouteBuilder endpoints)
{
return endpoints.MapHealthChecks("/api/health/highmark", new HealthCheckOptions
{
ResponseWriter = async (context, report) =>
{
var result = JsonConvert.SerializeObject(
new HighMarkResult
{
HighMark = HHandler.GetHighMark().High.ToString(),
}, Formatting.None,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
context.Response.ContentType = MediaTypeNames.Application.Json;
await context.Response.WriteAsync(result);
},
Predicate = (check) => check.Tags.Contains("highmark")
});
}
}
HHandler.GetHighMark()
是HHandler
class 中的非靜態方法:
public WatermarkOffsets GetHighMark()
{
return consumer.QueryWatermarkOffsets(TopicPartition.TopicPartition, TimeSpan.FromSeconds(2));
}
當我運行檢查時,我收到HTTP 500
錯誤,日志中出現以下錯誤:
2021-03-03 11:54:51.308Z 錯誤 APP=2227 COMP=3789 [13] 連接 ID“0HM6U7CJEMU0S”,請求 ID“0HM6U7CJEMU0S:00000001”:應用程序引發了未處理的異常。 - Logger=Microsoft.AspNetCore.Server.Kestrel,Level=ERROR,ThreadId=13,,Exception="System.MissingMethodException: 找不到方法:'Confluent.Kafka.WatermarkOffsets Ed.Md.FHandler.Health.HHandler.GetHighMark() '. 在 Ed.Health.HealthCheckHMark.<>c.<<-cctor>b__2_0>d.MoveNext() 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine) 在 Ed.Health.HealthCheckHMark。< >c.<.cctor>b__2_0(HttpContext context, HealthReport report) at Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.InvokeAsync(HttpContext httpContext) at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger 記錄器)在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 應用程序)“
我認為問題在於我試圖以 static 方式引用非靜態方法。 我該如何解決這個問題?
附加信息
這是我的HHandler
class:
public class HHandler : IHHandler
{
private readonly IConfig _config;
public IConsumer<Ignore, MdpMessage> consumer { get; set; }
public TopicPartitionOffset TopicPartition { get; set; }
public HHandler([NotNull] IConfig healthOptions)
{
_config = healthOptions;
}
public WatermarkOffsets GetHighMark()
{
return consumer.QueryWatermarkOffsets(TopicPartition.TopicPartition, TimeSpan.FromSeconds(2));
}
WatermarkOffsets IHHandler.GetHighMark()
{
return GetHighMark();
}
}
您要在此運行狀況檢查端點中檢查什么?
它通常用於檢查某些現有系統是否健康,例如內部數據庫連接正常,或者某些資源低於限制等。因此,您需要對該現有系統進行檢查 - 如果它不是靜態 class,則應該是某個地方的一個實例,singleton 也許,或者以某種方式創建該實例(例如某個工廠),如果它是瞬態的。 通常一個好主意是讓 DI 容器為您解析實例。 當然,前提是您使用的是 DI(嗯,在現代 AspNetCore 中,我認為您應該使用它:)
嘗試類似的東西
context.RequestServices.GetService(typeof(HHandler)).GetHighMark().High.ToString()
看看這是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.