返回BsonDocument在ApiController(Return BsonDocument i

2019-07-31 17:19发布

我在ASP.NET工作的一个API MVC 4,我使用MongoDB的作为后端。

由于MongoDB的存储和返回BSON对象,MVC4返回JSON对象,我想,这将是相当容易的,只需返回上休息呼叫BSON。

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

所以我想问一下,如果有一种方法来禁用JSON序列特定ApiController方法?

我目前的解决方法是反序列化JSON的从返回.toJson()返回它使得其将再次序列化之前,但这似乎有点浪费。

Answer 1:

想必你与你的应用程序和API控制器试图返回资源相关联的模式。 通过迫使它使用JSON,你是完全偏离主航道内容协商忽略了许多的WebAPI的好处。 如果你的客户想XML或YAML或...

您所遇到的问题是,的WebAPI不知道如何序列化BsonDocument。 所以,你可以为它使得它知道如何处理它写一个ModelBinder的。 另外,并暗指我的第一段,创建强类型实体/资源类和因为两者的MongoDB和的WebAPI已经知道了这些类型,他们将能够原生与他们一起工作。



Answer 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);                 
}

我在这篇文章中发现: 将字符串转换成MongoDB的BsonDocument

位火腿吝啬,但它的作品。



Answer 3:

我面临着同样的事情,并希望简化后端代码。

我发现动态的支持仅仅是因为驱动程序2.0版,在今年年初的工作。 只需更换BsonDocumentdynamic像这样的关键字:

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或客户现场“什么”。



文章来源: Return BsonDocument in ApiController