我在ASP.NET工作的一个API MVC 4,我使用MongoDB的作为后端。
由于MongoDB的存储和返回BSON对象,MVC4返回JSON对象,我想,这将是相当容易的,只需返回上休息呼叫BSON。
这并没有工作,所以我找到了.toJson()
上个方法BsonDocument
类,转换BSON对象的JSON字符串表示。 不幸的是,当我通过我回到这个字符串ApiController
,MVC显然认为它应该重新序列化字符串作为JSON,该浏览器无法解释。
所以我想问一下,如果有一种方法来禁用JSON序列特定ApiController
方法?
我目前的解决方法是反序列化JSON的从返回.toJson()
返回它使得其将再次序列化之前,但这似乎有点浪费。
想必你与你的应用程序和API控制器试图返回资源相关联的模式。 通过迫使它使用JSON,你是完全偏离主航道内容协商忽略了许多的WebAPI的好处。 如果你的客户想XML或YAML或...
您所遇到的问题是,的WebAPI不知道如何序列化BsonDocument。 所以,你可以为它使得它知道如何处理它写一个ModelBinder的。 另外,并暗指我的第一段,创建强类型实体/资源类和因为两者的MongoDB和的WebAPI已经知道了这些类型,他们将能够原生与他们一起工作。
我遇到过这个问题也一样,我拿着BSON数据,通过它迭代将每个文件在Web API结束JSON,因为我相信你做了,创建JSON字符串列表 - 我送这回和反序列化每个字符串回BSON文档:
List<string> data = response.Content.ReadAsAsync<List<string>>().Result;
List<BsonDocument> docList = new List<BsonDocument>();
foreach (string dataStr in data) {
BsonDocument doc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(dataStr);
docList.Add(doc);
}
我在这篇文章中发现: 将字符串转换成MongoDB的BsonDocument
位火腿吝啬,但它的作品。
我面临着同样的事情,并希望简化后端代码。
我发现动态的支持仅仅是因为驱动程序2.0版,在今年年初的工作。 只需更换BsonDocument
与dynamic
像这样的关键字:
public async Task<dynamic> GetAll(string collectionName)
{
//var collection = db.GetCollection<BsonDocument>(collectionName);
//var result = await collection.Find(new BsonDocument()).ToListAsync();
var collection = db.GetCollection<dynamic>(collectionName);
return await collection.Find(new BsonDocument()).ToListAsync();
}
也为插入:
var collection = db.GetCollection<dynamic>(collectionName);
await collection.InsertManyAsync(new List<dynamic>()
{
new
{
PointType = "Building",
Name = "My Place",
Location = GeoJson.Point(GeoJson.Position(lng, lat))
}
});
这是真正有用的创建迁移脚本。 但是不接受dynamic
或客户现场“什么”。