在ApiController中返回BsonDocument

时间:2012-09-19 08:47:23

标签: c# asp.net-mvc mongodb mongodb-.net-driver

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

由于MongoDB存储并返回BSON对象,而MVC4返回JSON对象,我认为在其余的调用上返回BSON会相当容易。

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

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

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

3 个答案:

答案 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或“其他任何事情”。来自客户网站。