我正在尝试 POST 一个列表或值数组,这些值会自动反序列化为一个名为 RejectModel 的复杂对象。这在接收 JSON 数据时非常有效,但在发送 XML 数据时,自动序列化程序使 rejectionList 为 NULL。
我已经尝试使用默认的 Xml 序列化程序而不是 dataContract 序列化程序。这给了我以下错误:
No MediaTypeFormatter is available to read an object of type 'List'1' from content with media type 'application/xml'.
我已尝试将列表更改为具有相同结果的数组。
我觉得我只是没有正确命名我的 XML 包含元素。如有任何建议,我们将不胜感激。
发布声明。接受 rejectModels 列表。
public HttpResponseMessage Post(List<RejectModel> rejectionList)
{
if (rejectionList == null)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "The request was empty, malformed, or did not include an array of values.");
}
else if (rejectionList.Rejections.Length == 0)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "An empty array was passed.");
}
}
拒绝模型,我想接受这些的列表/数组
[DataContract]
public class RejectModel : BaseModel
{
[Required]
[DataMember(IsRequired = true)]
public int LeadId { get; set; }
[DataMember]
public int? PropertyId { get; set; }
[DataMember]
public string PartnerPropertyId { get; set; }
[DataMember]
public string OriginalSource { get; set; }
[DataMember]
public DateTime OriginalReferralDate { get; set; }
}
我的许多请求尝试之一。我为“rejectList”尝试了很多标签名称。我在请求 header 中包含“Accept: application/xml”。
<?xml version="1.0" encoding="UTF-8"?>
<rejectList>
<RejectModel>
<LeadId>10102085</LeadId>
<PropertyId>60278</PropertyId>
</RejectModel>
</rejectList>
最佳答案
永不失败。奋斗两天,发布一个问题,30分钟内找到答案。
使用 DataContractSerializer(WebAPI 的默认 xml 序列化程序)时,您必须在 XML 请求和对象的 DataContract 中包含命名空间。您还需要将 xml 集合命名为“ArrayOf...”,即使您接收的是一个列表。这是一个遵循我的原始问题结构的示例:
[DataContract(Namespace = "http://blahblah.org/2013/Some.Namespace.You.Defined")]
public class RejectList{
List<RejectModel> list{
get;
set;
}
}
<ArrayOfRejectModel xmlns="http://blahblah.org/2013/Some.Namespace.You.Defined">
<RejectModel> ... </RejectModel>
<RejectModel> ... </RejectModel>
</ArrayOfRejectModel>
但是,如果您在 DataContract 装饰中包含空白命名空间,则不必在 XML 请求中包含命名空间。
[DataContract(Namespace = "")]
public class RejectList{
List<RejectModel> list{
get;
set;
}
}
<ArrayOfRejectModel>
<RejectModel> ... </RejectModel>
<RejectModel> ... </RejectModel>
</ArrayOfRejectModel>
相关阅读:
Adjust MVC 4 WebApi XmlSerializer to lose the nameSpace
关于.net - WebApi 无法将 XML 反序列化为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18836285/