4

CollectionJsonコンテンツを返すために、注目のプロジェクトと同様のアプローチを取っているConference APIプロジェクトに似た(ほぼ同一の)プロジェクトがあります。ReadDocument の Collection プロパティの設定 (30 行目) にはセッターがないため、問題が発生しています。次の変更を行うことで、この問題を回避できました

public CollectionJsonContent(Collection collection)
{
    var serializerSettings = new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            Formatting = Newtonsoft.Json.Formatting.Indented,
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    collection.Version = "1.0";

    Headers.ContentType = new MediaTypeHeaderValue("application/vnd.collection+json");

    using (var writer = new JsonTextWriter(new StreamWriter(_memoryStream)){CloseOutput = false})
    {
        //var readDocument = new ReadDocument(); {IReadDocument.Collection = collection};
        var serializer = JsonSerializer.Create(serializerSettings);
        serializer.Serialize(writer,collection);
        writer.Flush();
    }
    _memoryStream.Position = 0;
}

上記のコードはコンパイルされ、問題はある程度解決されますが、コントローラーの単体テストで JsonCollection コンテンツを使用できないという別の問題が発生します。次の単体テスト コード スニペットを検討してください。

            using (var request = CreateRequest())
            {                
                var controller = new TestController(DataService) {Request = request};

                var temp = await controller.ListAsync(gridSearchData, sampleSearchData);

                if ((temp is NotFoundResult) && (sampleCollection.Any()))
                {
                    Assert.Fail("Controller did not return any result but query did");
                }

                var json = await temp.ExecuteAsync(cancellationTokenSource);



                var readDocument = json.Content.ReadAsAsync<ReadDocument>(new[] {new CollectionJsonFormatter()}, cancellationTokenSource).Result;

         }

ReadDocument のコレクション プロパティを設定していないため、readDocument は常に空であり、その内容を読み取ることができません。WEB API プロジェクトのクライアント側で JsonCollection のコンテンツを非同期に読み取るにはどうすればよいですか?

アプローチの全体像を把握するには、Conference Web Api著者のブログを参照してください。

4

3 に答える 3

1

OK、これは修正されました。Collection プロパティが再び設定可能になりました。

私はちょうどリリース 0.7.0をプッシュして、この修正、メジャーなネーミングのリファクタリング、および空のコレクションを書き出さないようにするためのシリアライゼーションへの優れた改善を行いました。

変更点については、リリース ノートを参照してください(特に、パッケージ名と名前空間が変更されたため、名前が付けられています)。

于 2014-09-10T09:05:49.327 に答える
0

私はこれを調査しており、今週末に有望な解決策を考え出す予定です。これは、それをパブリック セッターにするか、セッターを内部にしてコレクションを受け入れるパブリック ctor を持つことです。

大変申し訳ありません。

于 2014-09-06T17:16:59.030 に答える