在 30000 毫秒内重试 6 次后失败。确保您的数据库在线并重试

Failed after retried for 6 times in 30000 ms. Make sure that your database is online and retry again

我正在尝试使用 Neo4j 的 .NET 驱动程序从我的 C# 代码连接到 Neo4j 数据库。我的 C# 桌面应用程序和 Neo4j 运行 在单独的 docker 容器上,通过 docker-compose 编排。提交查询时,驱动程序抛出异常并显示以下消息。

Exception thrown: 'Neo4j.Driver.ServiceUnavailableException' in System.Private.CoreLib.dll Exception is thrown: 'System.AggregateException' in System.Private.CoreLib.dll One or more errors occurred. (Failed after retried for 6 times in 30000 ms. Make sure that your database is online and retry again.)

docker-compose.yml:

version: '3.8'

services:
  myConsoleApp:
    image: ${DOCKER_REGISTRY-}myConsoleApp
    build:
      context: .
      dockerfile: MyConsoleApp/Dockerfile

  neo4j:
    image: neo4j:latest
    network_mode: "bridge"
    ports:
      - "7474:7474" # HTTP
      - "7687:7687" # Bolt
    environment:
      - NEO4J_dbms_security_procedures_unrestricted=apoc.*
      - NEO4J_apoc_import_file_enabled=true
      - NEO4J_dbms_shell_enabled=true
      - NEO4J_dbms_memory_pagecache_size=1G
      - NEO4J_dbms.memory.heap.initial_size=1G
      - NEO4J_dbms_memory_heap_max__size=1G
      - NEO4J_AUTH=neo4j/password
    volumes:
      - ./plugins:/plugins
      - ./data:/data
      - ./import:/import

我在 C# 控制台应用程序中访问它的方式:

var driver = GraphDatabase.Driver(
    "bolt://localhost:7687", 
    AuthTokens.Basic("neo4j", "password"));

using (var session = driver.AsyncSession())
{
    var x = session.WriteTransactionAsync(async tx =>
    {
        var result = await tx.RunAsync(
            "CREATE (a:Person:Employee)");
    });

    await x;
}

等待x时抛出异常。

我可以通过上面的设置确认,Neo4j 容器已经启动并正确地监听了 HTTP 端口,至少因为我可以通过 http://localhost:7474/browser/ 访问它。所以,我怀疑我从驱动程序中遗漏了一些东西。

您的控制台应用程序似乎正在使用“bolt://localhost:7687”,但这是 运行 在容器中,因此 localhost 将引用容器的本地主机。 我认为您会想要使用 neo4j 服务名称而不是 localhost。 螺栓://neo4j:7687