我使用以下代码调用了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[],并且容纳类型为ParamsTypeAParamsTypeB的项目)方面遇到问题

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模型中继承。

10-07 15:45