我正在尝试使用 JSON.NET 作为 WebAPI 2 堆栈中的默认序列化器。我已经实现了 JsonMediaTypeFormatter,其中使用 JSON.NET 序列化器来序列化/反序列化数据,并创建了 JsonContentNegotiator 来使用此媒体类型格式化程序。除了 OData 查询之外,所有工作都正常 - 如果我添加 [Queryable] 元数据或操作方法,则响应对象不包含任何元数据信息,仅包含实体列表。
小例子。我的行动方法:
[Queryable]
public async Task<PageResult<RuleType>> GetRuleType(ODataQueryOptions<RuleType> options)
{
var ret = await _service.ListRuleTypesAsync(options);
return new PageResult<RuleType>(
ret,
Request.GetNextPageLink(),
Request.GetInlineCount());
}
如果我使用默认的 OData 序列化并按规则类型调用一些查询(例如 -.../odata/RuleType?$inlinecount=allpages&$skip=0&$top=1
),我收到带有元数据信息和计数属性的经典 OData 响应:
odata.metadata ".../odata/$metadata#RuleType"
odata.count "2"
value
0 {
Id: 1
Name: "General"
Code: "General"
Notes: null
}
(跳过了一些字段,但我的 Notes 属性具有空值)
但如果我添加我的JsonContentNegotiator
with JsonMediaTypeFormatter
作为序列化器 - 我只收到实体列表:
[
{
"Id": 1,
"Name": "General",
"Code": "General"
}
]
(这里没有注释字段,因为NullValueHandling.Ignore
)
更。如果我删除[Queryable]
操作方法中的属性 - 我收到另一个结果:
{
"Items": [
{
"Id": 1,
"Name": "General",
"Code": "General"
}
],
"Count": 2
}
在这种情况下,我收到了 Count,但这里仍然没有元数据。而且 odata 响应属性名称也与默认值完全不同。
我的心快炸了。我只想在我的网络应用程序的任何部分使用 JSON.NET 作为我的序列化器(因为一些严格的限制)。我怎样才能做到这一点?