Невозможно подключиться к mongo db с помощью azure cosmos db

Я создал базу данных Cosmos DB в Azure и использую Mongo API. Я создал клиента и настроил его так:

_mongoDbConnectionString = configuration["MongoDBConnectionString"];
_databaseName = configuration["MongoDBName"];
_client = new MongoClient(_mongoDbConnectionString);
_database = _client.GetDatabase(_databaseName);
_collectionName = configuration["MongoDBCollectionName"];

Затем пытаясь записать данные -

_database.GetCollection<dynamic>(_collectionName).InsertOne(data);

Это не срабатывает с ошибкой -

A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "ReplicaSet", Type : "ReplicaSet", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/botframeworkcosmos.documents.azure.com:10255" }", EndPoint: "Unspecified/botframeworkcosmos.documents.azure.com:10255", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Я пробовал это решение - Истекло время ожидания после 30000 мс выбора сервера с помощью CompositeServerSelector, но оно не сработало.

Я также попытался установить политики SSL, подобные этой, для настройки клиента -

_mongoDbConnectionString = configuration["MongoDBConnectionString"];
_databaseName = configuration["MongoDBName"];
MongoClientSettings settings = MongoClientSettings.FromUrl(
  new MongoUrl(_mongoDbConnectionString)
);
settings.SslSettings =
  new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
_client = new MongoClient(settings);
_database = _client.GetDatabase(_databaseName);
_collectionName = configuration["MongoDBCollectionName"];

Я все еще получаю ту же ошибку. Странно то, что код тот же, вчера все работало.

Обновлять Я удалил базу данных и создал новую. Все еще та же проблема.

Есть идеи, в чем может быть проблема?

Вы уверены, что ваша строка подключения / URL-адрес верны в appsettings.json? Запись конечной точки выглядит немного странно с этим Unspecified/ перед Unspecified/botframeworkcosmos.documents.azure.com:10255.

Tseng 26.10.2018 09:03

@Tseng Моя строка подключения такая: mongodb://chatbotcosmos:<secret_key>@chatbotcosmos.documents‌​.azure.com:10255/?ss‌​l=true&replicaSet=gl‌​obaldb. Это моя новая строка подключения после воссоздания базы данных, скопированной в точности из Azure.

Souvik Ghosh 26.10.2018 09:34

Уверены, что он не получает строку подключения из другого источника? как appsettings.development.json при локальной отладке? Поскольку выше написано botframeworkcosmos.documents.azure.com, а у вас chatbotcosmos.documents.azure.com

Tseng 26.10.2018 09:40

@Tseng Да, теперь у меня есть новая строка подключения после того, как я удалил и воссоздал базу данных. Кроме того, конфигурация верна, что я проверил при отладке.

Souvik Ghosh 26.10.2018 09:42

Есть ли у вас в пароле специальные символы? например /, : или @? У вас не может быть специальных символов, потому что это URL-адрес (или, возможно, вам нужно его избежать)

Tseng 26.10.2018 09:52

@Tseng Нет. Пароль создается автоматически в Azure. Примерно так - 12pVpf5Y5spByBjHJkok2D0PfvaQYaTzmDGhZDXO96S0eH6RnQRuPkss4Mks‌​NYQjU6mx6d4YSbG3iaju‌​FSkCxQ==. Это был мой старый пароль, который работал вчера.

Souvik Ghosh 26.10.2018 09:57
6
6
3 347
2

Ответы 2

У меня было такое же сообщение об ошибке (упоминалось также A timeout occured after 30000ms с Unspecified). Это произошло потому, что брандмауэр моей компании блокировал исходящие соединения на порту Cosmos Mongo, например TCP 10255.

Я проверил это, временно запустив код за пределами сети нашей компании, и ошибка исчезла (я подтвердил, что когда я повторно запустил его снова внутри сети компании, он все еще не удался).

Поэтому добавление правила сетевого брандмауэра, разрешающего исходящие подключения к TCP-порту 10255, должно исправить это.

Спасибо. Я не смогу проверить это сейчас, но может быть позже.

Souvik Ghosh 15.05.2019 07:21

Проверить, чтобы принять во внимание:

  1. Строка подключения из среды базы данных Azure COSMOS
  2. Версия драйвера MongoDB

     private string userName = "FILLME";
            private string host = "FILLME";            
            private string dbName = "Tasks";
            private string collectionName = "TasksList";
    
          private IMongoCollection<MyTask> GetTasksCollection()
          {
            MongoClientSettings settings = new MongoClientSettings();
            settings.Server = new MongoServerAddress(host, 10255);
            settings.UseSsl = true;
            settings.SslSettings = new SslSettings();
            settings.SslSettings.EnabledSslProtocols = SslProtocols.Tls12;
    
            MongoIdentity identity = new MongoInternalIdentity(dbName, userName);
            PasswordEvidence evidence = new PasswordEvidence(password);
            settings.Credential = new MongoCredential("SCRAM-SHA-1", identity, evidence);
            MongoClient client = new MongoClient(settings);
            var database = client.GetDatabase(dbName);
            var todoTaskCollection = database.GetCollection<MyTask>(collectionName);
            return todoTaskCollection;
        }
    
         public List<MyTask> GetAllTasks()
         {
           try
           {
            var collection = GetTasksCollection();
            return collection.Find(new BsonDocument()).ToList();
            }
            catch (MongoConnectionException ex)
            {
              return new List<MyTask>();
            }
          }
    

Другие вопросы по теме