在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
或“任何”。