对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

连接故障排除

对于您在使用 MongoDB .NET/C# 驱动程序连接到一个 MongoDB 部署时可能遇到的问题,此页面提供了可能的解决方案。

注意

此页面仅解决连接问题。如果您在使用 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-256SCRAM-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-256SCRAM-SHA-1 连接到 MongoDB 时,无效的连接字符串是引发身份验证问题的最常见原因。

提示

有关连接字符串的更多信息,请参阅《连接指南》中的连接 URI

如果连接字符串包含用户名和密码,请确保格式正确。如果用户名或密码包含以下任何字符,则必须对它们进行百分比编码

: / ? # [ ] @

以下示例显示了如何对“#MyPassword?”进行百分号编码:

Console.WriteLine(System.Web.HttpUtility.UrlEncode("#MyPassword?"));

这会产生以下输出:

%23MyPassword%3F

尝试连接到 MongoDB 部署时,可以使用 MongoClientSettings 对象来配置设置。可以使用 Credential(凭证)属性设置身份验证信息。如果凭证信息不正确,则当您尝试连接到 MongoDB 部署时,会收到身份验证错误消息。

要使用用户名和密码,通过 SCRAM-SHA-256SCRAM-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 实例,检查这是否存在问题。在同一设备上部署无需任何授权即可连接。

如果您使用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 值,驱动程序将返回错误。

有关连接池化工作原理的更多信息,请参阅 连接池 指南。

当驱动程序尝试打开连接但已达到最大连接数时,会创建以下错误消息:

connection refused because too many open connections

以下部分介绍一种可能有助于解决此问题的方法。

If you must create more open connections, increase MaxConnectionPoolSize. For more information about checking the number of connections, see Check the Number of Connections in the Error Sending Message section.

当网络无法快速将请求从驱动程序传送到服务器时,就会出现超时。出现这种情况时,您可能会收到类似以下的错误信息:

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。有关检查连接数的更多信息,请参阅“错误发送消息”部分中的检查连接数