在 .NET 中使用 Web API 連接到 MongoDB
MongoDB是一種非常流行的NoSQL數據庫,其用戶基數以及功能列表同時都在迅猛增長中。 MongoDB可從這里下載安裝。如果你并不想為了試驗而安裝MongoDB,你還可以使用MongoDB服務托管提供商。在本演示中,我們將使用MongoHQ,下面我們就來開始在MongoHQ上設立MongoDB。
MongoHQ入門 – 云中的MongoDB
開始使用MongoHQ我們就先要進行注冊。通過接下來的幾個步驟,我們就能走完從注冊一直到創建出一個數據庫所需的過程。
第1步:首先你要輸入下列信息。
第2步:當你點擊Create Account按鈕之后,下一步就需要你輸入你的信用卡的信息,但這一步不是必需的,你可以跳過這一步,暫時選擇試用免費版。
第3步:此時你將在屏幕上看到,可以創建你的數據庫了。現在先不要完成這一步。在屏幕的右上角,你能看到你的賬戶名稱,點擊它得到一個下拉菜單,然后鼠標單擊Account Settings。
很重要的一點是,你要先設置好Default Database User(缺省數據庫用戶)。輸入適當的用戶名和秘密并把你輸入的這兩項內容記下來,比如你可以將這兩項內容設置為(administrator/password).
第5步:現在你可以單擊右上角的Create Database(創建數據庫)按鈕,從而轉到New Database(新建數據庫)屏幕。
第6步:在New Database頁面,選擇你想使用的主機類型。我選擇的是目前可免費使用的512MB的選項。你還要指定你的數據庫名稱,比如,可指定為MyFirstDb。單擊Create Database按鈕來完成DB創建過程。
一旦數據庫創建完成,你就可看到如下所示的對話框:
第7步:將Mongo URI記下來,后面你會用到它。現在我們的MongoDB實例就準備完畢了。
建立Web API
既然搞到了一個可以使用的MongoDB實例,現在我們就可以建立起向該實例發送數據和從該實例中獲取數據的Web API了。
第1步: 使用基本模版(或者是Web API模版)創建一個新的MVC 4 project。
第2步: 添加一個空白的叫做MongoDbController的WebAPiController。
第3步: 在Web.Config中,添加上面第7步中的連接字符串。如下所示,其中還要包括你所輸入的用戶名和口令:
要用你的所輸入的口令代替其中的‘xxxxxxxx’。
第4步: 使用下列命令從Nuget安裝MongoDB的驅動程序:
PM> Install-Package mongocsharpdriver第5步: 在MongoDbController中,添加一個叫做MongoDatabase類型的字段并用RetrieveMongohqDb方法對它進行初始化。
readonly MongoDatabase mongoDatabase;public MongoDbController() { mongoDatabase = RetreiveMongohqDb(); }</pre>
RetrieveMongohqDb方法使用我們在Web.Config中添加的連接字符串新建了一個MongoClient的實例,然后使用mongoClient這個新實例獲取到MongoServer,最后它從服務器中取到了我們的數據庫(MyFirstdb)。這可以保證,每次Controller被調用到時,MongoDb都會準備好以供我們使用。理想情況下應該把取得的數據庫放入一個Repository之中,但現在這里只是個演示代碼。
private MongoDatabase RetreiveMongohqDb() { MongoClient mongoClient = new MongoClient( new MongoUrl(ConfigurationManager.ConnectionStrings ["MongoHQ"].ConnectionString)); MongoServer server = mongoClient.GetServer(); return mongoClient.GetServer().GetDatabase("MyFirstDb"); }第6步: 添加一個數據模型實體,這在MongoDB中稱為document,其屬性如下所示:
public class Contact { [BsonId] public string Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string Email { get; set; } public string Phone { get; set; } }BsonId屬性是由MongoDb驅動程序提供的。在保持數據時,它會被會從字符串轉化為一個MongoDB能夠理解的Id;在載入/讀取數據時,它又會被從Id轉換回字符串。
第7步:實現獲取所有數據的請求 - 我們將創建一個從數據庫中獲取所有聯系人的Get方法。既然我們用的是WebApi Controller,那么我就可以簡單地將從數據庫中返回的數據轉化為可枚舉集合作為該方法的處理結果返回。該方法返回的Enumerable是Contact對象的List。
public IEnumerableGetAll() { List model = new List (); var contactsList = mongoDatabase.GetCollection("Contacts").FindAll().AsEnumerable(); model = (from contact in contactsList select new Contact { Id = contact["_id"].AsString, Name = contact["Name"].AsString, Address = contact["Address"].AsString, Phone = contact["Phone"].AsString, Email = contact["Email"].AsString }).ToList(); return model; } 第8步:創建或更新Contact – 記下來我們添加一個 HttpPost方法,它可接受一個Contact對象,并可根據該對象是否具有一個Id來決定,是要創建一個新聯系人還是要對已有聯系人進行更新。完成這個任務的代碼如下所示:
public Contact Save(Contact contact) { var contactsList = mongoDatabase.GetCollection("Contacts"); WriteConcernResult result; bool hasError = false; if (string.IsNullOrEmpty(contact.Id)) { contact.Id = ObjectId.GenerateNewId().ToString(); result = contactsList.Insert(contact); hasError = result.HasLastErrorMessage; } else { IMongoQuery query = Query.EQ("_id", contact.Id); IMongoUpdate update = Update .Set("Name", contact.Name) .Set("Address", contact.Address) .Set("Phone", contact.Phone) .Set("Email", contact.Email); result = contactsList.Update(query, update); hasError = result.HasLastErrorMessage; } if (!hasError) { return contact; } else { throw new HttpResponseException(HttpStatusCode.InternalServerError); } } 理想情況下我們可以對數據持久化邏輯進行分離處理并將它們放入一個Repository,我們應該把這個方法一分為二,一個方法用于插入數據,另一個用于對數據進行更新。要進行插入的條件很簡單,如果收到的Contact對象沒有Id,我們就創建一個新Id并將該對象發送給服務器;如果收到的Contact對象具有一個Id,我們就用contact.Id新建一個IMongoQuery對象,然后對IMongoUpdate實例中需要更新的屬性進行賦值。
最后,由contactsList這個collection使用相應的查詢實例以及更新實例除非真正的更新動作。我們可以通過對result.HasLastErrorMessage進行檢查來驗證插入或更新是否成功。
上面就是我們所有的代碼。由于我們沒有創建相應的UI,所以下面我將用Fiddler來進行測試。
對我們的Web API進行測試
運行該應用會顯式出一個著名的YSOD出錯屏,報告未找到相應的資源。
轉到/api/MongoDb/這個URL(例如 http://localhost:61093/api/MongoDb/),IE會下載相應的Json。第一次這個Json數組為空。
![]()
記下來我們用Fiddler的Composer組織出一個PUT請求,以JSON的格式向數據庫發送一個聯系人的信息。
![]()
現在再來執行一次Get請求,我們就能夠看到返回的是包含如下所示數據的Json。
![]()
最后,我們使用Fiddler重新組織一個POST請求,只把聯系人的名字從Suprotim改為Supro并發出該Post請求。這次后端的執行路徑會走到else那里,因為這次聯系人具有一個與之關聯的Id。結果,該聯系人的信息得到了更新。
你還可以使用MongoHq的dashboard完成與此相同的驗證過程。真酷!
結束語
作為一種NoSql文檔數據庫,MongoDB越來越受歡迎了。尤其是在需要快速數據存取但數據報告的速度并不作為評判標準情況下,它更受歡迎。今天我們蜻蜓點水式地講解了如何通過使用Web API從.NET中同MongoDB建立連接。我們采用的是一種免費的托管式解決方案。未來我們還會對如何使用本地MongoDB實例來完成該Demo進行探討。
完整下載本文所有的源代碼 (Github)