在 .NET 中使用 Web API 連接到 MongoD

from:http://www.oschina.net/translate/connect-to-mongodb-from-dotnet-using-web-api

MongoDB是一種非常流行的NoSQL數據庫,其用戶基數以及功能列表同時都在迅猛增長中。 MongoDB可從這裏下載安裝。如果你並不想爲了試驗而安裝MongoDB,你還可以使用MongoDB服務託管提供商。在本演示中,我們將使用MongoHQ,下面我們就來開始在MongoHQ上設立MongoDB。

請你下載完全Free的HTML5/jQuery網格

fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

MongoHQ入門 – 雲中的MongoDB

開始使用MongoHQ我們就先要進行註冊。通過接下來的幾個步驟,我們就能走完從註冊一直到創建出一個數據庫所需的過程。

第1步:首先你要輸入下列信息。

image

第2步:當你點擊Create Account按鈕之後,下一步就需要你輸入你的信用卡的信息,但這一步不是必需的,你可以跳過這一步,暫時選擇試用免費版。

credit-card-info

第3步:此時你將在屏幕上看到,可以創建你的數據庫了。現在先不要完成這一步。在屏幕的右上角,你能看到你的賬戶名稱,點擊它得到一個下拉菜單,然後鼠標單擊Account Settings。

account-settings

很重要的一點是,你要先設置好Default Database User(缺省數據庫用戶)。輸入適當的用戶名和祕密並把你輸入的這兩項內容記下來,比如你可以將這兩項內容設置爲(administrator/password).

create-super-user

第5步:現在你可以單擊右上角的Create Database(創建數據庫)按鈕,從而轉到New Database(新建數據庫)屏幕。

add-database

第6步:New Database頁面,選擇你想使用的主機類型。我選擇的是目前可免費使用的512MB的選項。你還要指定你的數據庫名稱,比如,可指定爲MyFirstDb。單擊Create Database按鈕來完成DB創建過程。

new-mongodb-database

一旦數據庫創建完成,你就可看到如下所示的對話框:

my-first-db-ready

第7步:將Mongo URI記下來,後面你會用到它。現在我們的MongoDB實例就準備完畢了。

fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

建立Web API

既然搞到了一個可以使用的MongoDB實例,現在我們就可以建立起向該實例發送數據和從該實例中獲取數據的Web API了。

第1步: 使用基本模版(或者是Web API模版)創建一個新的MVC 4 project。

第2步: 添加一個空白的叫做MongoDbController的WebAPiController。

image

第3步: 在Web.Config中,添加上面第7步中的連接字符串。如下所示,其中還要包括你所輸入的用戶名和口令:

1
<add name="MongoHQ" connectionString="mongodb://administrator:[email protected]:10010/MyFirstDb" />

要用你的所輸入的口令代替其中的‘xxxxxxxx’。

第4步: 使用下列命令從Nuget安裝MongoDB的驅動程序:

1
PM> Install-Package mongocsharpdriver

fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

第5步: 在MongoDbController中,添加一個叫做MongoDatabase類型的字段並用RetrieveMongohqDb方法對它進行初始化。
1
2
3
4
5
6
readonly MongoDatabase mongoDatabase;
 
public MongoDbController()
{
mongoDatabase = RetreiveMongohqDb();
}

RetrieveMongohqDb方法使用我們在Web.Config中添加的連接字符串新建了一個MongoClient的實例,然後使用mongoClient這個新實例獲取到MongoServer,最後它從服務器中取到了我們的數據庫(MyFirstdb)。這可以保證,每次Controller被調用到時,MongoDb都會準備好以供我們使用。理想情況下應該把取得的數據庫放入一個Repository之中,但現在這裏只是個演示代碼。

1
2
3
4
5
6
7
8
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,其屬性如下所示:

1
2
3
4
5
6
7
8
9
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轉換回字符串。

fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

第7步:實現獲取所有數據的請求 - 我們將創建一個從數據庫中獲取所有聯繫人的Get方法。既然我們用的是WebApi Controller,那麼我就可以簡單地將從數據庫中返回的數據轉化爲可枚舉集合作爲該方法的處理結果返回。該方法返回的Enumerable是Contact對象的List。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public IEnumerable<Contact> GetAll()
{
List<Contact> model = new List<Contact>();
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來決定,是要創建一個新聯繫人還是要對已有聯繫人進行更新。完成這個任務的代碼如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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>(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);
}
}
fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

理想情況下我們可以對數據持久化邏輯進行分離處理並將它們放入一個Repository,我們應該把這個方法一分爲二,一個方法用於插入數據,另一個用於對數據進行更新。要進行插入的條件很簡單,如果收到的Contact對象沒有Id,我們就創建一個新Id並將該對象發送給服務器;如果收到的Contact對象具有一個Id,我們就用contact.Id新建一個IMongoQuery對象,然後對IMongoUpdate實例中需要更新的屬性進行賦值。

最後,由contactsList這個collection使用相應的查詢實例以及更新實例除非真正的更新動作。我們可以通過對result.HasLastErrorMessage進行檢查來驗證插入或更新是否成功。

上面就是我們所有的代碼。由於我們沒有創建相應的UI,所以下面我將用Fiddler來進行測試。

fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

對我們的Web API進行測試

運行該應用會顯式出一個著名的YSOD出錯屏,報告未找到相應的資源。

轉到/api/MongoDb/這個URL(例如 http://localhost:61093/api/MongoDb/),IE會下載相應的Json。第一次這個Json數組爲空。

empty-json

記下來我們用Fiddler的Composer組織出一個PUT請求,以JSON的格式向數據庫發送一個聯繫人的信息。

put-new-contact

現在再來執行一次Get請求,我們就能夠看到返回的是包含如下所示數據的Json。

image

最後,我們使用Fiddler重新組織一個POST請求,只把聯繫人的名字從Suprotim改爲Supro併發出該Post請求。這次後端的執行路徑會走到else那裏,因爲這次聯繫人具有一個與之關聯的Id。結果,該聯繫人的信息得到了更新。

你還可以使用MongoHq的dashboard完成與此相同的驗證過程。真酷!

fbm
fbm
翻譯於 2年前

0人頂

 翻譯的不錯哦!

結束語

作爲一種NoSql文檔數據庫,MongoDB越來越受歡迎了。尤其是在需要快速數據存取但數據報告的速度並不作爲評判標準情況下,它更受歡迎。今天我們蜻蜓點水式地講解了如何通過使用Web API從.NET中同MongoDB建立連接。我們採用的是一種免費的託管式解決方案。未來我們還會對如何使用本地MongoDB實例來完成該Demo進行探討。

完整下載本文所有的源代碼 (Github)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章