2016-11-05 777 views
1

我正在開發使用MongoDB的一個C#MVC的Web API作爲backend.I試圖連接到使用我的MongoDB數據庫無法使用MongoClientSettings作爲參數來連接到MongoDB中到MongoClient

MongoClient mongoClient = new MongoClient(connectionString) 

其中ConnectionString的是格式:mongodb://Username:[email protected]

蒙戈DB是在虛擬機託管在Azure.I是能夠連接到數據庫和所有的作品好。不過我越來越頻繁的例外:

「MongoDb.driver.MongoConnectionException」。發生異常時 收到來自服務器的消息---> System.IO.IOException:無法從 讀取來自傳輸連接的數據:連接嘗試失敗 因爲關聯方沒有一段時間 後應對得當,......」

所以經過一些調查,我瞭解到,Azure是殺害空閒連接,我必須設置MaxConnectionIdleTime

爲了設置MaxConnectionIdleTime我決定在下面的方式

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的。在這種情況下,我使用的是相同的用戶名,這在我以前先連接在連接字符串中給定的密碼組合。

雖然試圖連接在這裏我得到內部異常:

MongoDB.Driver.MongoAuthenticationException: 「無法使用SASL協議機制SCRAM-SHA-1認證 」。無法讀取從傳輸連接數據:

回答

1

「MongoDb.driver.MongoConnectionException」而receivinf從服務器的消息---> System.IO.IOException發生.An異常連接嘗試失敗,因爲連接的方在一段時間後沒有正確響應......。

此異常背後的原因是在Azure中託管時,Azure試圖殺死空閒連接,但C#驅動程序不知道這一點。驅動程序嘗試在不知道連接不存在的情況下對已中斷的連接執行查詢。

解決方案是爲連接字符串設置maxIdleTimeMS = 45000。

這種方式的驅動程序不會使用長時間閒置的連接。

這裏是制定了我的連接字符串

的connectionString =「用戶名:[email protected]/ connectTimeoutMS = 30000 & socketTimeoutMS = 30000 & waitQueueTimeoutMS = 30000 & maxIdleTimeMS = 45000「