我正在为集成测试设置 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");
问题很可能是 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 映像之间的网络配置,以确保确保它公开暴露模拟器端点。