.net - 尝试从 linux docker 容器连接时,Cosmos DB .net 引发错误
问题描述
我目前正在将 MongoDB 后端迁移到 Cosmos DB。连接、读取和写入工作正常,Windows 主机没有问题。
作为我正在使用的连接字符串(如 azure 入门部分中提供的那样)
string connectionString =
@"mongodb://aaa:bbb@ccc.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&maxIdleTimeMS=120000&appName=@ddd@";
MongoClientSettings settings = MongoClientSettings.FromUrl(
new MongoUrl(connectionString)
);
settings.SslSettings =
new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
var mongoClient = new MongoClient(settings);
如果我为 linux docker 容器编译应用程序,我会在运行时(本地和天蓝色)收到此错误:
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HM09JMTH8P61", Request id "0HM09JMTH8P61:00000004": An unhandled exception was thrown by the application.
System.TimeoutException: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "ReplicaSet", Type : "ReplicaSet", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/aaa.mongo.cosmos.azure.com:10255" }", EndPoint: "Unspecified/aaa.mongo.cosmos.azure.com:10255", ReasonChanged: "Heartbeat", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
---> System.PlatformNotSupportedException: Sockets on this platform are invalid for use after a failed connection attempt.
at System.Net.Sockets.Socket.ThrowMultiConnectNotSupported()
at System.Net.Sockets.Socket.BeginConnect(String host, Int32 port, AsyncCallback requestCallback, Object state)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.ConnectAsync(Socket socket, EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.SslStreamFactory.CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.ServerMonitor.HeartbeatAsync(CancellationToken cancellationToken)", LastHeartbeatTimestamp: "2020-06-05T22:14:26.2687880Z", LastUpdateTimestamp: "2020-06-05T22:14:26.2687882Z" }] }.
at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException(IServerSelector selector, ClusterDescription description)
at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChangedHelper.HandleCompletedTask(Task completedTask)
at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChanged(IServerSelector selector, ClusterDescription description, Task descriptionChangedTask, TimeSpan timeout, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Clusters.Cluster.SelectServer(IServerSelector selector, CancellationToken cancellationToken)
at MongoDB.Driver.MongoClient.AreSessionsSupportedAfterServerSelection(CancellationToken cancellationToken)
at MongoDB.Driver.MongoClient.AreSessionsSupported(CancellationToken cancellationToken)
at MongoDB.Driver.MongoClient.StartImplicitSession(CancellationToken cancellationToken)
at MongoDB.Driver.OperationExecutor.StartImplicitSession(CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.FindSync[TProjection](FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
at MongoDB.Driver.FindFluent`2.ToCursor(CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)
at backend.Services.UserService.Get() in /home/vsts/work/1/s/backend/Services/UserService.cs:line 41
at backend.Controllers.UsersController.Get() in /home/vsts/work/1/s/backend/Controllers/UserController.cs:line 36
at lambda_method2(Closure , Object , Object[] )
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequest[TContext](IHttpApplication`1 application)
root@4ebf2742cd2d:/app# nslookup aaa.mongo.cosmos.azure.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
aaa.mongo.cosmos.azure.com canonical name = cdb-ms-prod-westus1-bbb.cloudapp.net.
Name: cdb-ms-prod-westus1-bbb.cloudapp.net
Address: 40.112.xx.xx
测试图像:
- mcr.microsoft.com/dotnet/nightly/runtime-deps:latest
- mcr.microsoft.com/dotnet/nightly/runtime-deps:5.0-alpine
- mcr.microsoft.com/dotnet/nightly/runtime-deps:5.0-focal
我不知道问题可能是什么。有人遇到熟悉的事情吗?
谢谢
编辑 1:与此同时,我安装了一个 Ubuntu 20.04 VM 以在没有 docker 的情况下对其进行测试,结果相同。所以当使用 linux 作为运行时会有一些问题。
解决方案
出于愚蠢,我使用了当前测试版的 MongoDB.Driver。切换回当前稳定版本可以解决问题。
我提交了一个错误报告:https ://jira.mongodb.org/browse/CSHARP-3126
推荐阅读
- python - 为什么 max() 打印错误的数量?
- python - 如何从 txt.readlines() 中提取数据?
- javascript - 有没有办法抵消或延迟 li 动画?
- go - 如何在 bpftrace 中为 golang 函数参数使用结构
- sanity - 如何在 Sanity.io 架构中自动填充引用的文档?
- vue.js - 根据屏幕大小有条件地从 DOM 中删除元素
- html - 如何知道浏览器将使用哪个 `unicode-range` 来预加载字体?
- sql - 如何编写 SQL 代码以生成 4 级 JSON 输出?
- laravel - Laravel 包登录重定向到带有 302 状态码的起始页面
- java - 出现输入键盘时导航栏位置出现黑色空白区域问题