我使用以下代码调用WebAPI:
gem uninstall gherkin
>> select all
bundle install
ParamsGeneric类是一个带有2个派生类的抽象类型:
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();
我怀疑WebAPI中的反序列化存在问题:
[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()
{}
}
我对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[]
&amp; ParamsTypeA
类型的项目< / p>
WebAPI会收到一个空白数组(ParamsTypeB
)以及其他参数。
帮助将受到关注。
更新
即使我尝试传递单个ParamsGeneric[0]
对象而不是数组,我也会收到ParamsGeneric
而不是对象。
解
null
诀窍。
答案 0 :(得分:1)
虽然在messages / 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模型中继承。
答案 1 :(得分:0)
尝试将数据传递到您的API,如下所示
Dictionary<string, string> param = new Dictionary<string, string>();
param.Add("paramA", paramA);
param.Add("paramB", paramB);
HttpClient client = new HttpClient();
HttpFormUrlEncodedContent contents = new HttpFormUrlEncodedContent(param);
var result = await client.PostAsync(new Uri("http://localhost:8490/api/path/tofunc")
, contents);
var reply = await result.Content.ReadAsStringAsync();
if (reply.IsSuccessStatusCode)
{
}
希望这会对你有所帮助。
答案 2 :(得分:-1)
[HttpPost]
[Route("api/path/tofunc")]
public async Task<bool> DoStuffAsync([FromBody]ClientData clientData)
{
....
}
请在Web api方法中保留[FromBody],以便模型绑定器将您的正文数据映射到参数,即clientData。