我刚刚将MVC4 / WebApi v1应用程序更新为MVC5 + WebAPI2 ..
似乎在升级之后,Json.Net序列化程序将不再包含使用OData $ expand方法的请求的正确$类型。请参阅下面的一个例子,我的意思是......
正确:
请求:http://url.com/api/Studies/277/Sites
响应:
{
$id: "1"
$type: "LGCYDAPI.Domain.Model.StudySiteWithContacts, LGCYDAPI.Domain.Model"
Contacts: [
{
$id: "2"
$type: "LGCYDAPI.Domain.Model.ContactRelatedToSite, LGCYDAPI.Domain.Model"
ContactID: -38445
}],
SiteID: 38445
}
不正确:
请求:http://url.com/api/Studies/277/Sites?$ expand =通讯录
响应:
{
$id: "1"
$type: "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib"
Contacts: [
{
$id: "2"
$type: "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib"
ContactID: -38445
}],
SiteID: 38445}
与MVC和WebAPI程序集一起,我将JSON.NET从5.0.6更新到6.0.3,我认为这是问题..但是,我还原到v5并且它没有解决问题所以我是回到第6节。还更新了OData nugets - 我当前的版本是Microsoft.Data.OData = 5.6.0和Microsoft.AspNet.WebApi.OData = 5.1.2。
JSON序列化程序设置:
pConfiguration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
pConfiguration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
pConfiguration.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;
pConfiguration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
答案 0 :(得分:1)
响应有效负载中的$ type用于序列化实际对象。
在结果上应用$ expand时,返回对象的结构从LGCYDAPI.Domain.Model.StudySiteWithContacts
更改为SelectExpandWrapper
。
因此,您无法在应用$ expand的情况下获得预期的网站类型。
对于SelectExpandWrapper
结构,请检查:
https://aspnetwebstack.codeplex.com/wikipage?title=%24select%20and%20%24expand%20support