文档菜单
文档首页
/ / /
C#/.NET

连接故障排除

在本页

  • 连接错误
  • 检查您的连接字符串
  • 配置您的防火墙
  • 认证错误
  • 检查您的连接字符串
  • 验证 MongoClientSettings 属性
  • 验证用户是否在认证数据库中
  • X.509 凭证错误
  • 发送消息错误
  • 检查用户权限
  • 配置您的防火墙
  • 检查连接数
  • 打开连接过多
  • 检查连接数
  • 超时错误
  • 设置 connectTimeoutMS
  • 检查连接数

本页提供了解决您在使用 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-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

您可以使用MongoClientSettings对象在尝试连接到MongoDB部署时配置设置。您可以使用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值,驱动程序将响应错误。

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

返回

常见问题