在ApiController中返回BsonDocument

我正在使用ASP.NET MVC 4中的API,我使用MongoDB作为后端。

由于MongoDB存储和返回BSON对象,以及MVC4返回JSON对象,我认为在其余调用上简单地返回BSON会相当容易。

这不起作用,所以我在BsonDocument类上找到了.toJson()方法,将BSON对象转换为JSON字符串表示。 不幸的是,当我通过我的ApiController返回此字符串时,MVC显然认为它应该将字符串重新序列化为JSON,浏览器无法解释。

所以我想问一下是否有办法禁用特定ApiController方法的JSON序列化?

我目前的解决方法是在返回之前对从.toJson()返回的JSON进行反序列化,使其再次序列化,但这似乎相当浪费。

据推测,您有一个与您的应用程序关联的架构以及您的api控制器尝试返回的资源。 通过强制它使用json,您通过完全回避内容协商忽略了WebApi的许多好处。 如果您的客户想要xml或者yaml或者……

您遇到的问题是WebApi不知道如何序列化BsonDocument。 所以,你可以为它编写一个ModelBinder,使它知道如何处理它。 或者,并提及我的第一段,创建强类型的实体/资源类,因为MongoDB和WebApi都已经知道这些类型,他们将能够本地使用它们。

我也遇到了这个问题,我接受了Bson数据,迭代通过它将每个文档转换为Web API端的json,正如我所假设的那样,创建一个json字符串列表 – 我将其发回并将每个字符串反序列化为一个Bson文件:

 List data = response.Content.ReadAsAsync>().Result; List docList = new List(); foreach (string dataStr in data) { BsonDocument doc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize(dataStr); docList.Add(doc); } 

我在这篇文章中找到了: 将字符串转换为MongoDB BsonDocument

比特火腿吝啬,但它的作用。

我面对同样的事情,想要简化后端代码。

我发现动态支持仅仅是自今年年初的驱动程序v2.0起作用。 只需用dynamic关键字替换BsonDocument ,如下所示:

 public async Task GetAll(string collectionName) { //var collection = db.GetCollection(collectionName); //var result = await collection.Find(new BsonDocument()).ToListAsync(); var collection = db.GetCollection(collectionName); return await collection.Find(new BsonDocument()).ToListAsync(); } 

还有插入:

 var collection = db.GetCollection(collectionName); await collection.InsertManyAsync(new List() { new { PointType = "Building", Name = "My Place", Location = GeoJson.Point(GeoJson.Position(lng, lat)) } }); 

创建迁移脚本非常有用。 但是,不接受来自客户端站点的dynamic或“任何”。