.net - WebApi 无法将 XML 反序列化为列表

标签 .net xml serialization asp.net-web-api

我正在尝试 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

Remove namespace in XML from ASP.NET Web API

How to serialize xml into desired format in asp.net web api

关于.net - WebApi 无法将 XML 反序列化为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18836285/

相关文章:

c# - .NET:WebBrowser、WebClient、WebRequest、HTTPWebRequest……啊!

c# - Rx .NET 首先获取并在时间间隔或条件之后跳过

c# - 使用 Json.NET 将 JObject 的一部分转换为 Dictionary<string, string>

xml - 打开巨大的 XML 文件和 pretty-print

c# - 将 java 字节转换为 c# 字节(序列化问题)

c# - LINQ ForEach 语句

java - 使用本地 DTD 验证 XML,引发错误

java - 我无法运行我的第一个 Spring 应用程序,Hello World?我已经添加了所有 jar

c - 用 C 序列化包

.net 将 xml 反序列化为多个已知对象之一