2016-11-05 4 views
1

Я занимаюсь разработкой веб-API C# MVC, который использует MongoDB в качестве backend.I попытался подключения к базе данных MongoDB с использованиемНевозможно подключиться к MongoDb используя MongoClientSettings в качестве параметра MongoClient

MongoClient mongoClient = new MongoClient(connectionString) 

где ConnectionString в формате: mongodb://Username:[email protected]

Монго дб размещено в виртуальной машине в Azure.I может подключиться к базе данных и все работает good.But Я получаю частые исключения:

«MongoDb.driver.MongoConnectionException». Исключение произошло в то время как receivinf сообщение с сервера ---> System.IO.IOException: не удалось прочитать данные из транспортного соединения: попытка подключения завершилась неудачно , потому что подключенная сторона не правильно реагировать после периода времени, ......»

Так после немного исследований я узнал, что Azure убивает неактивные соединения, и я должен установить MaxConnectionIdleTime.

Для того, чтобы установить MaxConnectionIdleTime я решил подключиться к MongoDB в ниже пути

var credential = MongoCredential.CreateCredential("dbname", "UserName", "Password"); 

var settings = new MongoClientSettings 
{ 
    Credentials = new[] { credential }, 
    Server = new MongoServerAddress("HostName", 27017), 
    MaxConnectionIdleTime = new TimeSpan(0, 3, 0) 
}; 
MongoClient mongoClient = new MongoClient(settings); 

В этом случае я использую один и тот же логин, пароль комбинации приведены в строке подключения, который я использовал для подключения раньше.

При попытке подключения здесь я получаю внутреннее исключение:

MongoDB.Driver.MongoAuthenticationException: "Не удалось проверить подлинность с использованием механизма протокола SASL SCRAM-SHA-1".

ответ

1

«MongoDb.driver.MongoConnectionException» произошло .AN исключения при receivinf сообщения от сервера ---> System.IO.IOException: Не удается прочитать данные из транспортного соединения: Попытка подключения не удалось, поскольку соединенная сторона не отвечал должным образом после определенного периода времени, ...

Причина этого исключения заключается в том, что при размещении в Azure Azure пытается убить незанятые соединения, но драйвер C# не знает об этом. Драйвер пытается выполнять запросы на убитые соединения, не зная, что соединение не существует.

Решение, разработанное для меня, - это установить maxIdleTimeMS = 45000 в строку подключения.

В этом случае драйвер не будет использовать соединение, которое долгое время простаивало.

Вот строка подключения, которая работала для меня

ConnectionString = "Имя пользователя: [email protected]/ connectTimeoutMS = 30000 & socketTimeoutMS = 30000 & waitQueueTimeoutMS = 30000 & maxIdleTimeMS = 45000 "

Смежные вопросы