9

ASP.NET MVC 4でAPIに取り組んでおり、バックエンドとしてMongoDBを使用しています。

MongoDBはBSONオブジェクトを格納して返すため、MVC4はJSONオブジェクトを返すため、残りの呼び出しでBSONを返すのはかなり簡単だと思いました。

これは機能しなかったので、クラスの.toJson()メソッドを見つけてBsonDocument、BSONオブジェクトをJSON文字列表現に変換しました。残念ながら、この文字列を自分で返すApiControllerと、MVCは、文字列をJSONとして再シリアル化する必要があると考えているようです。これは、ブラウザが解釈できません。

ApiControllerでは、特定のメソッドのJSONシリアル化を無効にする方法があるかどうかを尋ねたいのですが。

私の現在の回避策は、返される前に返されたJSONを逆シリアル化して.toJson()、再度シリアル化されるようにすることですが、これはかなり無駄に思えます。

4

3 に答える 3

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

この投稿で見つけたもの:文字列をMongoDBBsonDocumentに変換する

ビットハムはこぶしですが、動作します。

于 2013-01-16T12:53:52.917 に答える
1

おそらく、アプリケーションに関連付けられたスキーマと、APIコントローラーが返そうとしているリソースがあります。jsonを使用するように強制することで、コンテンツのネゴシエーションを完全に回避することでWebApiの利点の多くを無視することになります。クライアントがxmlまたはyamlまたは...を必要としている場合はどうなりますか?

あなたが経験している問題は、WebApiがBsonDocumentをシリアル化する方法を知らないということです。したがって、ModelBinderを記述して、処理方法を認識できるようにすることができます。または、最初の段落をほのめかして、強く型付けされたエンティティ/リソースクラスを作成します。MongoDBとWebApiはどちらもこれらの型をすでに知っているため、ネイティブで操作できます。

于 2012-09-19T12:50:34.137 に答える
1

私も同じ問題に直面しており、バックエンドコードを単純化したいと考えていました。

ダイナミックのサポートは、今年の初めにドライバー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ただし、クライアントサイトから「何でも」受け入れないでください。

于 2015-08-31T11:05:33.387 に答える