.NET Core SDK创建Cosmos DB遇异常:容器成功数据库创建无限循环
解决Cosmos DB模拟器容器创建后调用CreateDatabaseIfNotExistsAsync无限循环的问题
核心原因
容器启动成功≠Cosmos服务完全就绪,你注释掉了等待日志中服务就绪的代码,导致容器刚启动就立刻发起数据库创建请求,此时服务还没准备好接收请求,客户端会持续重试,陷入无限循环。
具体解决方案
1. 恢复日志等待逻辑
取消注释.WaitForMessageInLog("Cosmos service is successfully listening")代码,确保容器内的Cosmos服务完全启动后,再执行客户端操作:
var containerService = new Builder() .UseContainer() .WithName(name) .UseImage($"mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator") .ReuseIfExists() .ExposePort(exposedPort, ContainerCosmosServicePort) .WaitForMessageInLog("Cosmos service is successfully listening") .Build();
该语句会阻塞执行,直到服务日志出现指定内容,确保服务处于就绪状态。
2. 检查异步调用上下文
如果程序入口Main方法未标记为async Task,直接使用await可能引发死锁,需确保入口方法为异步:
static async Task Main(string[] args) { // 你的业务代码逻辑 }
3. 添加请求超时保护
在CosmosClientOptions中设置请求超时,避免无限等待:
CosmosClientOptions options = new() { HttpClientFactory = () => new HttpClient(new HttpClientHandler() { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }), RequestTimeout = TimeSpan.FromSeconds(30) // 设置30秒超时阈值 };
4. 验证端口映射有效性
确认本地8083端口未被其他程序占用,可通过命令行执行netstat -ano | findstr :8083检查端口占用情况,若被占用,更换暴露端口即可。
内容的提问来源于stack exchange,提问作者Shashikant Nalavade
相关产品推荐
相关产品推荐

