TestContainers.CosmosDB 每当进行任何 CosmosClient API 调用时总是会卡住

问题描述 投票:0回答:1

我正在为集成测试设置 TestContainers.CosmosDB。下面是我用于通过 docker 镜像运行 CosmosDB 模拟器的代码。

var cosmosDb = new CosmosDbBuilder()
  .WithImage("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest")
  .Build();
await cosmosDb.StartAsync();

接下来是我用来连接到正在运行的实例的代码块。但创建数据库的调用永远不会返回 - 最后一行。运行代码时,我可以浏览 CosmosDB 资源管理器并看到数据库实例已在本地启动,但我无法通过 CosmosClient 与其进行交互。如何使用 CosmosClient 与 TestContainer 实例交互?我在 Windows 机器上运行 Linux 容器。 我在这里发布了这段代码 - https://github.com/riteshksriv/ConsoleAppCosmosDB

var clientOptions = new CosmosClientOptions
{
  ConnectionMode = ConnectionMode.Gateway,
  HttpClientFactory = () =>
  {
    HttpMessageHandler httpMessageHandler = new HttpClientHandler()
    {
      ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
    };
    return new HttpClient(httpMessageHandler);
  }
};
var cosmosClient = new CosmosClient(connectionString, clientOptions);
var dbResponse = await cosmosClient.CreateDatabaseIfNotExistsAsync("MyDatabase");
c# .net azure-cosmosdb testcontainers
1个回答
0
投票

问题很可能是 SDK 无法与模拟器建立 HTTP 连接。

在这些情况下,SDK 会不断重试多达 120 次来尝试恢复。

如果您在操作上传递CancellationToken,则可以停止重试。

例如:

CancellationTokenSource cancellation = new CancellationTokenSource(TimeSpan.FromSeconds(60));

... other code...

var dbResponse = await cosmosClient.CreateDatabaseIfNotExistsAsync("MyDatabase", cancellation.Token);

如果抛出

OperationCanceledException
,则意味着问题是模拟器的 HTTP 端点无法访问,您需要验证运行 SDK 代码的计算机与运行模拟器的计算机/实例/docker 映像之间的网络配置,以确保确保它公开暴露模拟器端点。

© www.soinside.com 2019 - 2024. All rights reserved.