2013-09-16 2 views
3

Я выкладываю список или массив значений, которые автоматически десериализованных к сложному объекту под названием RejectModel. Это отлично работает при получении данных как JSON, но при отправке XML-данных автоматический сериализатор делает rejectionList NULL.WebAPI не десериализации XML в список

Я попытался использовать сериализатор по умолчанию 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». Я включаю «Accept: application/xml» в заголовок запроса.

<?xml version="1.0" encoding="UTF-8"?> 
<rejectList> 
<RejectModel> 
<LeadId>10102085</LeadId> 
<PropertyId>60278</PropertyId> 
</RejectModel> 
</rejectList> 
+0

Не могли бы вы обновить вопрос с кодом, где вы публикуете это к методу? – Fals

ответ

4

Никогда не сработает. Борьба в течение двух дней, задайте вопрос, найдите ответ за 30 минут.

При использовании DataContractSerializer (по умолчанию XML-сериализатор для WebAPI) вы должны включить пространство имен в свой 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

Смежные вопросы