我有一个具有以下动作签名的 API 控制器...
[HttpPost]
public HttpResponseMessage DoSearch(SearchParameters parameters)
SearchParameters
不是我可以修改的,反编译的源代码看起来像这样......
[DebuggerStepThrough]
[XmlRoot("SearchData", IsNullable = false, Namespace = "http://company.com/some/namespace/v1")]
[GeneratedCode("xsd", "2.0.50727.3038")]
[DesignerCategory("code")]
[XmlType(Namespace = "http://company.com/some/namespace/v1")]
[Serializable]
public class SearchParameters
{
private string[] _searchCodes;
[XmlArrayItem("SearchCode", IsNullable = false)]
public string[] SearchCodes
{
get
{
return this._searchCodes;
}
set
{
this._searchCodes = value;
}
}
}
我可以使用 XML 有效负载成功调用端点,但根本无法让 JSON 工作。SearchCodes 属性始终为空。
如果我将 SearchParameters 类型替换为没有任何 Xml 序列化属性的 POCO,则它适用于 JSON。这使我认为 JsonMediaTypeFormatter 由于 xml 序列化属性而无法正确匹配该属性(尽管这不重要,因为它的 JSON,而不是 XML,对吗?)。我更改了 JsonFormatter 以使用 DataContract Serializer,但这并没有什么区别。
httpConfiguration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
我尝试制作不同的 JSON 结构,看看我是否可以“帮助”它理解,但这些都不起作用......
{
"SearchData": {
"SearchCodes": {
"SearchCode": [
"SYAA113F",
"N0TEXI5T",
"SYAA112C"
]
}
}
}
{
"SearchCodes": {
"SearchCode": [
"SYAA113F",
"N0TEXI5T",
"SYAA112C"
]
}
}
{
"SearchCodes": [
"SYAA113F",
"N0TEXI5T",
"SYAA112C"
]
}
{
"SearchData": {
"SearchCode": [
"SYAA113F",
"N0TEXI5T",
"SYAA112C"
]
}
}
{
"SearchCode": [
"SYAA113F",
"N0TEXI5T",
"SYAA112C"
]
}
{
"SearchCodes": [
{ "SearchCode" : "SYAA113F" },
{ "SearchCode" : "SYAA113F" },
{ "SearchCode" : "SYAA113F" }
]
}
我该如何进一步调试?我错过了什么?由于 XML 属性,导致 JSON 媒体格式化程序的行为不同的原因是什么?