问题描述
我正在使用具有 .net 核心 API 的 neo4jclient 图形数据库。我必须添加健康检查。我使用 Ihealthcheck 界面创建了自己的健康检查。下面是我的健康检查课
公共类 DatabaseHealthCheck : IHealthCheck
{
public DatabaseHealthCheck(IGraphClient graphClient)
{
_graphClient = graphClient;
}
private readonly IGraphClient _graphClient;
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,CancellationToken cancellationToken = default(CancellationToken))
{
try
{
var result = await _graphClient.Cypher.Match(@"show databases")
.Return((n) => n.As<DatabaseDetail>()).ResultsAsync;
foreach (var res in result)
{
if (res.currentStatus == "Online")
{
return await Task.Fromresult(
HealthCheckResult.Healthy("Healthy"));
}
}
}
catch (Exception ex)
{
return new HealthCheckResult(status: context.Registration.FailureStatus,exception: ex);
}
return HealthCheckResult.Healthy();
// return await Task.Fromresult(
// new HealthCheckResult(context.Registration.FailureStatus,// "Unhealthy"));
}
}
通过此运行状况检查,我想获取数据库详细信息,然后检查数据库天气是否在线,但出现以下错误
Neo4j 返回了有效响应,但是 Neo4jClient 无法反序列化为您提供的对象结构。
有人可以帮我吗?
解决方法
您正在编写的查询不会返回任何内容,您实际执行的是:
MATCH (show databases)
RETURN n
如果您将代码更改为如下所示,您可以看到这一点:
var query = _graphClient.Cypher.Match(@"show databases")
.Return((n) => n.As<string>());
var text = query.Query.DebugQueryText;
var result = await query.ResultsAsync;
如果您在其中放置一个断点以便您可以看到 text
变量是什么,您将能够看到它。
现在!当您使用 GraphClient
时,我想不出如何获得您想要的东西 - BoltGraphClient
可能是可能的 - 但您得到的错误意味着您正在使用前者。
如果您在 BoltGraphClient
上,您可以访问 Driver
并执行:
var session = ((BoltGraphClient)_graphClient).Driver.AsyncSession(d => d.WithDatabase("system"));
var cursor = await session.RunAsync("SHOW DATABASES");
while (await cursor.FetchAsync())
{
var name = cursor.Current.Values["name"].As<string>();
var status = cursor.Current.Values["currentStatus"].As<string>();
Console.WriteLine($"{name} is {status.ToUpperInvariant()}");
}
我不知道有关 http GraphClient
的任何其他工作 - 需要将其添加到客户端。理论上 - 如果您愿意,这不是一个复杂的 PR。