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 と著者のブログを参照してください。