首页 > 解决方案 > 如何解决“Neo4j 返回了有效响应,但是 Neo4jClient 无法反序列化为您提供的对象结构。” 错误?

问题描述

我正在使用带有 .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 无法反序列化为您提供的对象结构。

谁能帮我 ?

标签: c#.net-coreneo4jgraph-databasesneo4jclient

解决方案


您正在编写的查询不会返回任何内容,您实际执行的是:

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。


推荐阅读