连接故障排除
在此页面上
对于您在使用 MongoDB .NET/C# 驱动程序连接到一个 MongoDB 部署时可能遇到的问题,此页面提供了可能的解决方案。
注意
此页面仅解决连接问题。如果您在使用 MongoDB 或驱动程序时遇到任何其他问题,请访问以下资源:
.NET/ C#驱动程序的常见问题解答 ( 常见问题解答 )
问题和帮助页面,其中包含有关报告错误、促进驱动程序发挥作用以及查找其他资源的信息
MongoDB Community 论坛,用于提问、讨论或获取一般技术支持
连接错误
以下错误消息指示驱动程序无法通过指定主机名或端口连接到服务器。多种情况都可能生成此错误消息。在此示例错误消息中,主机名是 127.0.0.1
,端口是 27017
:
Error: couldn't connect to server 127.0.0.1:27017
以下各节描述您可以采取的可能解决问题的措施。
设置连接字符串
确认连接字符串中的主机名和端口号都准确无误。MongoDB 实例的默认端口值为 27017
,但您可以将 MongoDB 配置为在其他端口上进行通信。
配置防火墙
确认 MongoDB 部署监听的端口未被同一网络上的防火墙阻塞。MongoDB 默认使用 27017
端口。如要进一步了解 MongoDB 使用的默认端口以及如何更改它们,请参阅默认 MongoDB 端口。
警告
请勿在防火墙中打开端口,除非您确定该端口是 MongoDB 部署使用的端口。
身份验证错误
如果身份验证机制配置不正确,.NET/C# 驱动程序可能无法连接到 MongoDB 实例。如果您使用 SCRAM-SHA-256
或 SCRAM-SHA-1
进行身份验证并且驱动程序无法连接,驱动程序可能会引发类似于以下消息之一的错误消息:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server <hostname>:<port>.
Authentication failed","attr":{"mechanism":"SCRAM-SHA-256","principalName": "<db_username>","<auth database>":"<db_username>","client":"127.0.0.1:2012", "result":"UserNotFound: Could not find user}}
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
以下各节描述您可以采取的可能解决问题的措施。
设置连接字符串
当尝试使用连接字符串以及 SCRAM-SHA-256
或 SCRAM-SHA-1
连接到 MongoDB 时,无效的连接字符串是引发身份验证问题的最常见原因。
提示
有关连接字符串的更多信息,请参阅《连接指南》中的连接 URI。
如果连接字符串包含用户名和密码,请确保格式正确。如果用户名或密码包含以下任何字符,则必须对它们进行百分比编码:
: / ? # [ ] @
以下示例显示了如何对“#MyPassword?”进行百分号编码:
Console.WriteLine(System.Web.HttpUtility.UrlEncode("#MyPassword?"));
这会产生以下输出:
%23MyPassword%3F
验证 MongoClientSettings 属性
尝试连接到 MongoDB 部署时,可以使用 MongoClientSettings
对象来配置设置。可以使用 Credential
(凭证)属性设置身份验证信息。如果凭证信息不正确,则当您尝试连接到 MongoDB 部署时,会收到身份验证错误消息。
验证用户是否在身份验证数据库中
要使用用户名和密码,通过 SCRAM-SHA-256
或 SCRAM-SHA-1
成功对连接进行身份验证,必须在身份验证数据库中定义用户名。默认身份验证数据库是 admin
数据库。要使用不同的数据库进行身份验证,请在连接字符串中指定 authSource
选项。以下示例指示驱动程序使用 users
作为身份验证数据库:
using MongoDB.Driver; // Connection URI const string connectionUri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users"; // Create a new client and connect to the server var client = new MongoClient(connectionUri);
还可以通过创建 MongoClientSettings
对象并将其传递给 MongoClient
构造函数来设置配置设置。可以使用 Credential
(凭证)属性设置登录凭证,包括指定身份验证数据库。如需了解有关使用 MongoClientSettings
的更多信息以及一些示例,请参阅使用 MongoClientSettings。
您可以尝试使用相同代码连接到本地设备上托管的 MongoDB 实例,检查这是否存在问题。在同一设备上部署无需任何授权即可连接。
X. 509凭证错误
如果您使用Windows作为操作系统,则可能会遇到.NET/ C#驱动程序无法在内存中找到X.509
身份验证证书的问题。 引发此错误并显示以下错误消息:
No credentials are available in the security package
以下部分介绍一种可能有助于解决此问题的方法。
创建证书并将其存储在磁盘上
使用以下代码生成应用程序所需的任何X.509
证书:
using (X509Certificate2 certWithKey = certOnly.CopyWithPrivateKey(key)) { return new X509Certificate2(certWithKey.Export(X509ContentType.Pkcs12)); }
发送消息时出错
当您发出请求后驱动程序无法发送命令时,可能会显示以下错误消息:
com.mongodb.MongoSocketWriteException: Exception sending message
以下各节描述您可以采取的可能解决问题的措施。
检查用户权限
确认已使用正确的用户访问 MongoDB 部署。错误中的术语“message”可以是驱动程序发送的命令。如果使用无权发送命令的用户,驱动程序可能会生成此错误。
另请确保用户对要发送的消息具有适当的权限。 MongoDB 使用基于角色的访问控制 (RBAC) 来控制对 MongoDB 部署的访问。 有关如何在 MongoDB 中配置 RBAC 的更多信息,请参阅基于角色的访问控制。
配置防火墙
防火墙需要具有开放端口,用于与 MongoDB 实例通信。有关配置防火墙的更多信息,请参阅“连接错误”部分中的配置防火墙。
检查连接数
每个 MongoClient
实例在其连接池中支持最大数量的并发打开连接。您可以配置定义此限制的参数 MaxConnectionPoolSize
。默认值为 100
。如果打开的连接数已等于 MaxConnectionPoolSize
,则服务器将等待,直到连接可用。如果此等待时间超过 MaxConnectionIdleTime
值,驱动程序将返回错误。
有关连接池化工作原理的更多信息,请参阅常见问题解答中的连接池化在 .NET/C# 驱动程序中是如何工作的?。
打开的连接过多
当驱动程序尝试打开连接但已达到最大连接数时,会创建以下错误消息:
connection refused because too many open connections
以下部分介绍一种可能有助于解决此问题的方法。
检查连接数
如需创建更多打开连接,请增加 MaxConnectionPoolSize
。有关检查连接数的更多信息,请参阅“错误发送消息”部分中的检查连接数。
超时错误
当网络无法快速将请求从驱动程序传送到服务器时,就会出现超时。出现这种情况时,您可能会收到类似以下的错误信息:
timed out while checking out a connection from connection pool: context canceled
如果收到此错误,请尝试以下操作来解决问题。
设置 connectTimeoutMS
驱动程序在无法建立连接时可能会挂起,因为驱动程序尝试访问无法访问的副本集节点时花费了太长时间。 您可以使用connectTimeMS
设置来限制驱动程序尝试建立连接所花费的时间。 要了解有关此设置的更多信息,请参阅 MongoDB Server手册中的 超时选项 。
应确保 connectTimeoutMS
设置不低于副本集节点的最高网络延迟。如果从节点之一的延迟为 10000 毫秒,则将 connectTimeoutMS
设置为 9000 可防止驱动程序连接到该节点。
您可以在连接字符串上设置该选项。以下示例将 connectTimeoutMS
设置为 10000 毫秒。
using MongoDB.Driver; // Connection URI const string connectionUri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?connectTimeoutMS=10000"; // Create a new client and connect to the server var client = new MongoClient(connectionUri);
您还可以通过创建 MongoClientSettings
对象并将其传递给 MongoClient
构造函数来设置配置设置。有关如何使用 MongoClientSettings
的详细信息以及一些示例,请参阅使用 MongoClientSettings。
检查连接数
与服务器的连接数可能超过 MaxConnectionPoolSize
。有关检查连接数的更多信息,请参阅“错误发送消息”部分中的检查连接数。