连接故障排除
在本页
本页提供了解决您在使用 MongoDB .NET/C# 驱动程序连接到 MongoDB 部署时可能遇到的问题的潜在解决方案。
注意
本页仅针对连接问题。如果您遇到任何其他与 MongoDB 或驱动程序相关的问题,请访问以下资源
的常见问题(FAQ) 关于 .NET/C# 驱动程序
问题 & 帮助 页面,其中包含有关报告错误、为驱动程序做出贡献和查找其他资源的详细信息
的MongoDB 社区论坛 用于提问、讨论或一般技术支持
连接错误
以下错误信息表明驱动程序无法连接到指定主机名或端口的服务器。多种情况可能会生成此错误信息。在此示例错误信息中,主机名为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属性
您可以使用MongoClientSettings
对象在尝试连接到MongoDB部署时配置设置。您可以使用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
值,驱动程序将响应错误。
有关连接池如何工作更多信息,请参阅FAQ中的.NET/C# 驱动中的连接池是如何工作的?
过多打开的连接
当驱动程序尝试打开连接,但已达到最大连接数时,它会创建以下错误消息
connection refused because too many open connections
以下部分描述了一种可能有助于解决问题的方法。
检查连接数
如果您需要创建更多打开的连接,请增加MaxConnectionPoolSize
。有关检查连接数的更多信息,请参阅错误发送消息部分中的检查连接数。
超时错误
当网络无法足够快地从驱动程序发送请求到服务器时,它可能会超时。在这种情况下,您可能会收到类似于以下消息的错误
timed out while checking out a connection from connection pool: context canceled
如果您收到此错误,请尝试以下操作以解决问题。
设置连接超时时间
当驱动程序无法建立连接时,它可能挂起,因为驱动程序尝试连接不可达的副本集节点花费了太长时间。您可以通过使用 connectTimeMS
设置来限制驱动程序尝试建立连接的时间。有关此设置的更多信息,请参阅服务器手册中的超时选项。
您应确保 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
。有关检查连接数的更多信息,请参阅错误发送消息部分中的检查连接数。