我使用以下代码调用了WebAPI:
var client = new HttpClient
{
BaseAddress = new Uri("http://localhost:8490/")
};
var jObject = new JObject();
jObject.Add("paramA", paramA);
jObject.Add("paramB", paramB);
JArray jArr = JArray.FromObject(paramsGenericArr);
jObject.Add("paramC", jArr);
var content = new StringContent(jObject.ToString(), Encoding.UTF8, "application/json");
var result = await client.PostAsync("api/path/tofunc", content).ConfigureAwait(false);
result.EnsureSuccessStatusCode();
ParamsGeneric类是具有2个派生类的抽象类型:
[DataContract]
public class ParamsTypeA : ParamsGeneric
{
[DataMember]
public long itemC {get; set;}
public ParamsTypeA() :
base()
{}
}
[DataContract]
public class ParamsTypeB : ParamsGeneric
{
[DataMember]
public long itemD {get; set;}
public ParamsTypeB() :
base()
{}
}
[DataContract]
[KnownType(typeof(ParamsTypeA))]
[KnownType(typeof(ParamsTypeB))]
public abstract class ParamsGeneric
{
[DataMember]
public long itemA { get; set; }
[DataMember]
public long itemB {get; set;}
public ParamsGeneric()
{}
}
我怀疑WebAPI中的反序列化有问题:
public class ClientData
{
public string paramA { get; set; }
public string paramB { get; set; }
public ParamsGeneric[] paramC { get; set; }
}
[HttpPost]
[Route("api/path/tofunc")]
public async Task<bool> DoStuffAsync(ClientData clientData)
{
....
}
我在
paramsGenericArr
/ paramC
(类型为ParamsGeneric[]
,并且容纳类型为ParamsTypeA
和ParamsTypeB
的项目)方面遇到问题WebAPI接收空白数组(
ParamsGeneric[0]
)以及其他参数。帮助将被申请。
更新
即使我尝试传递单个
ParamsGeneric
对象而不是数组,我也会收到null
而不是对象。解
var serializer = new JsonSerializer();
serializer.TypeNameHandling = TypeNameHandling.Auto;
JArray jArr = JArray.FromObject(paramsGenericArr, serializer);
做到了。
最佳答案
虽然消息/ json中的继承肯定是可能的,但是恕我直言;这太麻烦了:)
无论如何,您实际上可以通过设置TypeNameHandling让Newtonsoft.Json为您处理继承
// Allow inheritance in json payload
JsonSerializerSettings serializerSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
serializerSettings.TypeNameHandling = TypeNameHandling.All;
.. 要不就
serializerSettings.TypeNameHandling = TypeNameHandling.Auto;
..根据您的需要。
这是简单的修补程序,如果它是内部API,或者可以保证始终由客户端控制,则可以正常工作。如果您有外部客户端,则可以使用“覆盖默认模型绑定程序”方法,例如此处发布的“ Deserialising Json to derived types in Asp.Net Web API”-或强烈考虑避免在API模型中继承。