Esta página ofrece soluciones potenciales a los problemas que pueda encontrar al usar el controlador MongoDB .NET/C# para conectarse a una implementación de MongoDB.
Nota
Esta página solo aborda problemas de conexión. Si tiene algún otro problema con MongoDB o el controlador, visite los siguientes recursos:
La Preguntas frecuentes (FAQ) para el controlador .NET/C#
La página de Problemas y Ayuda, que proporciona información sobre cómo reportar errores, contribuir al controlador y encontrar recursos adicionales.
La Foros de la comunidad de MongoDB para preguntas, debates o soporte técnico general
Error de conexión
El siguiente mensaje de error indica que el controlador no puede conectarse a un servidor en el hostname o puerto definido. Varias situaciones pueden generar este mensaje de error. En esta muestra de mensaje de error, el hostname es 127.0.0.1 y el puerto es 27017:
Error: couldn't connect to server 127.0.0.1:27017
Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.
Verifica tu cadena de conexión
Verifica que el nombre de host y el número de puerto en la cadena de conexión sean ambos precisos. El valor por defecto del puerto para una instancia de MongoDB es 27017, pero puede configurar MongoDB para que se comunique en otro puerto.
Configura tu cortafuegos
Verifica que los puertos en los que escucha tu implementación de MongoDB no estén bloqueados por un firewall en la misma red. MongoDB usa el puerto 27017 por defecto. Para obtener más información sobre los puertos por defecto que utiliza MongoDB y cómo cambiarlos, consulte Puerto por defecto de MongoDB.
Advertencia
No abra un puerto en su firewall a menos que esté seguro de que es el puerto utilizado por su implementación de MongoDB.
Error de autenticación
El controlador .NET/C# puede fallar al conectarse a una instancia de MongoDB si el mecanismo de autenticación no está configurado correctamente. Si usa SCRAM-SHA-256 o SCRAM-SHA-1 para la autenticación y el controlador no se conecta, podría generar un mensaje de error similar a uno de los siguientes:
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.
Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.
Verifica tu cadena de conexión
Una cadena de conexión no válida es la causa más común de problemas de autenticación al intentar conectarse a MongoDB usando cadenas de conexión y SCRAM-SHA-256 o SCRAM-SHA-1.
Tip
Para obtener más información sobre las cadenas de conexión,consulte URI de conexión en la Guía de conexión.
Si la cadena de conexión contiene un nombre de usuario y una contraseña, asegúrate de que estén en el formato correcto. Si el nombre de usuario o la contraseña incluye alguno de los siguientes caracteres, deben estar codificados en porcentaje:
: / ? # [ ] @
El siguiente ejemplo muestra cómo codificar porcentualmente "#MyPassword?":
Console.WriteLine(System.Web.HttpUtility.UrlEncode("#MyPassword?"));
Esto da como resultado el siguiente resultado:
%23MyPassword%3F
Verificar las propiedades de MongoClientSettings
Se puede utilizar un objeto MongoClientSettings para configurar los ajustes al intentar conectar a una implementación de MongoDB. Puede utilizar la propiedad Credential para configurar la información de autenticación. Si las credenciales no son correctas, recibirás errores de autenticación cuando intentes conectarte a tu implementación de MongoDB.
Verificar que el usuario esté en la base de datos de autenticación
Para autenticar correctamente una conexión utilizando un nombre de usuario y contraseña con SCRAM-SHA-256 o SCRAM-SHA-1, el nombre de usuario debe estar definido en la base de datos de autenticación. La base de datos de autenticación por defecto es la base de datos admin. Para usar una base de datos diferente para la autenticación, especifica la opción authSource en la cadena de conexión. El siguiente ejemplo indica al controlador que utilice users como la base de datos de autenticación:
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);
También se pueden establecer configuraciones creando un objeto MongoClientSettings y pasándolo al constructor MongoClient. Puedes usar la propiedad Credential para establecer las credenciales de inicio de sesión, incluido especificar la base de datos de autenticación. Para obtener más información sobre el uso de MongoClientSettings, así como algunos ejemplos, consulta Usar MongoClientSettings.
Puedes comprobar si este es el problema intentando conectarte a una instancia de MongoDB alojada en la máquina local con el mismo código. Una implementación en la misma máquina no requiere ninguna autorización para conectarse.
X.509 Error de credencial
Si utilizas Windows como sistema operativo, podrías encontrarte con un problema en el que el controlador .NET/C# no pueda localizar un certificado de autenticación X.509 en la memoria. Este error muestra el siguiente mensaje:
No credentials are available in the security package
Para solucionar este problema, añade el siguiente código a tu aplicación. Este código genera cualquier certificado de X.509 que requiera tu aplicación y los almacena en disco:
using (X509Certificate2 certWithKey = certOnly.CopyWithPrivateKey(key)) { return new X509Certificate2(certWithKey.Export(X509ContentType.Pkcs12)); }
Error al enviar el mensaje
Cuando el controlador no logra enviar una orden después de que hayas realizado una solicitud, puede mostrar el siguiente mensaje de error:
com.mongodb.MongoSocketWriteException: Exception sending message
Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.
Comprobar los permisos de usuario
Verifica que hayas accedido a la implementación de MongoDB con el usuario correcto. El término 'mensaje' en el error puede ser un comando enviado por el controlador. Si estás usando un usuario que no tiene permisos para enviar el comando, el controlador podría generar este error.
También asegúrate de que el usuario tenga los permisos adecuados para el mensaje que estás enviando. MongoDB utiliza el control de acceso basado en roles (RBAC) para controlar el acceso a una implementación de MongoDB. Para obtener más información sobre cómo configurar RBAC en MongoDB, consulta Control de acceso basado en roles.
Configura tu cortafuegos
El firewall debe tener un puerto abierto para comunicarse con la instancia de MongoDB. Para obtener más información sobre la configuración del firewall,consulte "Configurar el firewall" en la sección "Error de conexión".
Comprobar el número de conexiones
Cada instancia de MongoClient admite un número máximo de conexiones simultáneas abiertas en su pool de conexiones. Se puede configurar el parámetro MaxConnectionPoolSize que define este límite. El valor por defecto es 100. Si ya hay un número de conexiones abiertas igual a MaxConnectionPoolSize, el servidor espera hasta que una conexión esté disponible. Si este tiempo de espera supera el valor de MaxConnectionIdleTime, el controlador responde con un error.
Para obtener más información sobre cómo funciona la agrupación de conexiones, consulte ¿Cómo funciona la agrupación de conexiones en el controlador .NET/C#? en las preguntas frecuentes.
Demasiadas conexiones abiertas
El controlador genera el siguiente mensaje de error cuando intenta abrir una conexión, pero se ha alcanzado el número máximo de conexiones:
connection refused because too many open connections
La siguiente sección describe un método que podría ayudar a resolver el problema.
Comprobar el número de conexiones
Si necesita crear más conexiones abiertas,MaxConnectionPoolSize aumente. Para obtener más información sobre cómo comprobar el número de conexiones, consulte la sección "Comprobar el número de conexiones" en la sección "Mensaje de error al enviar".
Error de tiempo de espera
Cuando la red no puede entregar una solicitud del driver al servidor lo suficientemente rápido, puede agotar el tiempo de espera. Cuando esto ocurre, puedes recibir un mensaje de error similar al siguiente mensaje:
timed out while checking out a connection from connection pool: context canceled
Si recibes este error, intenta la siguiente acción para solucionar el problema.
Establezca connectTimeoutMS
El driver puede bloquearse cuando no puede establecer una conexión porque tarda demasiado intentando alcanzar nodos inalcanzables del set de réplicas. Puede limitar el tiempo que el controlador pasa intentando establecer la conexión mediante la configuración connectTimeMS. Para saber más sobre este ajuste, consulta las Opciones de tiempo de espera en el manual del servidor.
Debe asegurarse de que el ajuste de connectTimeoutMS no sea inferior a la mayor latencia de red que tiene hacia un nodo del conjunto. Si uno de los nodos secundarios tiene una latencia de 10 000 milisegundos, configurar el connectTimeoutMS en 9000 impide que el driver se conecte a ese nodo.
Se puede configurar esta opción en la cadena de conexión. El siguiente ejemplo establece connectTimeoutMS en 10 000 milisegundos.
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);
También se pueden establecer configuraciones creando un objeto MongoClientSettings y pasándolo al constructor MongoClient. Para obtener más información sobre el uso de MongoClientSettings, así como algunos ejemplos, consulte Uso de MongoClientSettings.
Comprobar el número de conexiones
El número de conexiones al servidor puede MaxConnectionPoolSize superar. Para obtener más información sobre cómo comprobar el número de conexiones, consulte la sección "Comprobar el número de conexiones en el mensaje de error al enviar".