12
返回列表 发新帖
楼主: jieforest

在.NET使用Web API连接MongoDB

[复制链接]
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
11#
 楼主| 发表于 2013-6-3 11:04 | 只看该作者
第6步: 添加一个数据模型实体,这在MongoDB中称为document,其属性如下所示:

1        public class Contact
2        {
3        [BsonId]
4        public string Id { get; set; }
5        public string Name { get; set; }
6        public string Address { get; set; }
7        public string Email { get; set; }
8        public string Phone { get; set; }
9        }

BsonId属性是由MongoDb驱动程序提供的。在保持数据时,它会被会从字符串转化为一个MongoDB能够理解的Id;在载入/读取数据时,它又会被从Id转换回字符串。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
12#
 楼主| 发表于 2013-6-3 11:04 | 只看该作者
第7步:实现获取所有数据的请求

我们将创建一个从数据库中获取所有联系人的Get方法。既然我们用的是WebApi Controller,那么我就可以简单地将从数据库中返回的数据转化为可枚举集合作为该方法的处理结果返回。该方法返回的Enumerable是Contact对象的List。

01        public IEnumerable<Contact> GetAll()
02        {
03        List<Contact> model = new List<Contact>();
04        var contactsList = mongoDatabase.GetCollection("Contacts").FindAll().AsEnumerable();
05        model = (from contact in contactsList
06          select new Contact
07          {
08           Id = contact["_id"].AsString,
09           Name = contact["Name"].AsString,
10           Address = contact["Address"].AsString,
11           Phone = contact["Phone"].AsString,
12           Email = contact["Email"].AsString
13          }).ToList();
14          return model;
15        }

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
13#
 楼主| 发表于 2013-6-3 11:05 | 只看该作者
第8步:创建或更新Contact

记下来我们添加一个 HttpPost方法,它可接受一个Contact对象,并可根据该对象是否具有一个Id来决定,是要创建一个新联系人还是要对已有联系人进行更新。完成这个任务的代码如下所示:

01        public Contact Save(Contact contact)
02        {
03        var contactsList = mongoDatabase.GetCollection("Contacts");
04        WriteConcernResult result;
05        bool hasError = false;
06        if (string.IsNullOrEmpty(contact.Id))
07        {
08          contact.Id = ObjectId.GenerateNewId().ToString();
09          result = contactsList.Insert<Contact>(contact);
10          hasError = result.HasLastErrorMessage;
11        }
12        else
13        {
14          IMongoQuery query = Query.EQ("_id", contact.Id);
15          IMongoUpdate update = Update
16           .Set("Name", contact.Name)
17           .Set("Address", contact.Address)
18           .Set("Phone", contact.Phone)
19           .Set("Email", contact.Email);
20           result = contactsList.Update(query, update);
21           hasError = result.HasLastErrorMessage;
22        }
23        if (!hasError)
24        {
25          return contact;
26        }
27        else
28        {
29          throw new HttpResponseException(HttpStatusCode.InternalServerError);
30        }
31        }

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
14#
 楼主| 发表于 2013-6-3 11:05 | 只看该作者
理想情况下我们可以对数据持久化逻辑进行分离处理并将它们放入一个Repository,我们应该把这个方法一分为二,一个方法用于插入数据,另一个用于对数据进行更新。要进行插入的条件很简单,如果收到的Contact对象没有Id,我们就创建一个新Id并将该对象发送给服务器;如果收到的Contact对象具有一个Id,我们就用contact.Id新建一个IMongoQuery对象,然后对IMongoUpdate实例中需要更新的属性进行赋值。

最后,由contactsList这个collection使用相应的查询实例以及更新实例除非真正的更新动作。我们可以通过对result.HasLastErrorMessage进行检查来验证插入或更新是否成功。
上面就是我们所有的代码。由于我们没有创建相应的UI,所以下面我将用Fiddler来进行测试。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
15#
 楼主| 发表于 2013-6-3 11:05 | 只看该作者
对我们的Web API进行测试

运行该应用会显式出一个著名的YSOD出错屏,报告未找到相应的资源。

转到/api/MongoDb/这个URL(例如 http://localhost:61093/api/MongoDb/),IE会下载相应的Json。第一次这个Json数组为空。


使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
16#
 楼主| 发表于 2013-6-4 13:12 | 只看该作者
接下来我们用Fiddler的Composer组织出一个PUT请求,以JSON的格式向数据库发送一个联系人的信息。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
17#
 楼主| 发表于 2013-6-4 13:12 | 只看该作者
现在再来执行一次Get请求,我们就能够看到返回的是包含如下所示数据的Json。



最后,我们使用Fiddler重新组织一个POST请求,只把联系人的名字从Suprotim改为Supro并发出该Post请求。这次后端的执行路径会走到else那里,因为这次联系人具有一个与之关联的Id。结果,该联系人的信息得到了更新。

你还可以使用MongoHq的dashboard完成与此相同的验证过程。真酷!

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
18#
 楼主| 发表于 2013-6-4 13:12 | 只看该作者
结束语

作为一种NoSql文档数据库,MongoDB越来越受欢迎了。尤其是在需要快速数据存取但数据报告的速度并不作为评判标准情况下,它更受欢迎。今天我们蜻蜓点水式地讲解了如何通过使用Web API从.NET中同MongoDB建立连接。我们采用的是一种免费的托管式解决方案。未来我们还会对如何使用本地MongoDB实例来完成该Demo进行探讨。

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
19#
 楼主| 发表于 2013-6-4 13:13 | 只看该作者

使用道具 举报

回复
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
20#
 楼主| 发表于 2013-6-4 13:13 | 只看该作者
over.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表