我正在使用ASP.NET MVC 4中的API,我使用MongoDB作为后端。
由于MongoDB存储并返回BSON对象,而MVC4返回JSON对象,我认为在其余的调用上返回BSON会相当容易。
这不起作用,所以我在.toJson()
类上找到了BsonDocument
方法,将BSON对象转换为JSON字符串表示。不幸的是,当我通过ApiController
返回此字符串时,MVC显然认为它应该将字符串重新序列化为JSON,浏览器无法解释它。
所以我想问一下是否有办法禁用特定ApiController
方法的JSON序列化?
我目前的解决方法是在返回之前对从.toJson()
返回的JSON进行反序列化,使其再次序列化,但这似乎相当浪费。
答案 0 :(得分:2)
据推测,您有一个与您的应用程序相关联的架构以及您的api控制器尝试返回的资源。通过强制它使用json,您通过完全回避内容协商忽略了WebApi的许多好处。如果您的客户需要xml或yaml或......
,该怎么办?您遇到的问题是WebApi不知道如何序列化BsonDocument。所以,你可以为它编写一个ModelBinder,使它知道如何处理它。或者,并提及我的第一段,创建强类型的实体/资源类,因为MongoDB和WebApi都已经知道这些类型,他们将能够本地使用它们。
答案 1 :(得分:2)
我也遇到了这个问题,我接受了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);
}
我在这篇文章中找到了:Convert string into MongoDB BsonDocument
Bit ham fisted,但它确实有效。
答案 2 :(得分:1)
我面对同样的事情,想要简化后端代码。
我发现Support for dynamic仅在今年年初的驱动程序v2.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
或“其他任何事情”。来自客户网站。