REST API только устанавливает определенные свойства объекта - PullRequest
4 голосов
/ 19 января 2012

Я работаю над REST API, который я публикую для использования POST и XML в качестве контента. В моем методе WebInvoke он, кажется, сериализует только некоторые свойства. Например, я передаю FirstName, LastName, Email, Phone и Address, но он не устанавливает свойства Email и Address. Поэтому, когда он добавляет данные в мою базу данных, эти поля остаются пустыми.

Почему это? Почему он устанавливает одни свойства, а другие нет? Я попытался изменить порядок заказа, и это ни на что не повлияло. Это также подводит меня к еще одному вопросу: ВСЕ ли свойства должны быть переданы в xml, или будет достаточно только нескольких таких, как я? Я надеюсь, что ответ не нужен, потому что это может быть довольно динамичная система, и новые свойства могут часто добавляться без изменения XML.

Вот некоторые из соответствующих кодов:

public class Lead
{
    #region Public Properties
    [DataMember(Name = "LeadId")]
    public int LeadId { get; set; }
    [DataMember(Name="FirstName")]
    public string FirstName { get; set; }
    [DataMember(Name = "MiddleName")]
    public string MiddleName { get; set; }
    [DataMember(Name = "LastName")]
    public string LastName { get; set; }
    [DataMember(Name = "Email")]
    public string Email { get; set; }
    [DataMember(Name = "Email2")]
    public string Email2 { get; set; }
    [DataMember(Name = "Phone")]
    public string Phone { get; set; }
    [DataMember(Name = "Phone2")]
    public string Phone2 { get; set; }
    [DataMember(Name = "Address")]
    public string Address { get; set; }
    [DataMember(Name = "Address2")]
    public string Address2 { get; set; }
    [DataMember(Name = "Address3")]
    public string Address3 { get; set; }
    [DataMember(Name = "City")]
    public string City { get; set; }
    [DataMember(Name = "State")]
    public string State { get; set; }
    [DataMember(Name = "Zip")] etc...

Вот операция Контракт

[OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "leads",
        BodyStyle= WebMessageBodyStyle.Bare,
        RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml)]
    string AddLead(Lead lead);

Вот функция AddLead в Сервисе:

public string AddLead(Lead lead)
    {
        string result = lead.Submit();
        if (result == "Success")
        {
            return "Success. " + lead.LeadId;
        }
        else
        {
            return result;
        }
    }

А вот XML, который я передаю:

<?xml version="1.0" encoding="utf-8"?>
   <Lead xmlns="http://www.myrenamednamespace.com/leads">
      <FirstName>John</FirstName>
      <LastName>Doe</LastName>
      <Email>JohnDoe@gmail.com</Email>
      <Phone>8885551234</Phone>
      <Address>123 Fake St</Address>
      <City>Fake City</City>
   </Lead>

1 Ответ

2 голосов
/ 19 января 2012

Вам необходимо указать порядок в DataMember.DataContractSerializer принимает алфавитное упорядочение, если вы не укажете иное, и игнорирует элементы, которые он находит в ожидаемом порядке (именно поэтому он позвонил, но не отправил электронное письмо успешно)

public class Lead
{
    [DataMember(Name = "LeadId", Order=1)]
    public int LeadId { get; set; }

    [DataMember(Name = "FirstName", Order = 2)]
    public string FirstName { get; set; }

    [DataMember(Name = "MiddleName", Order = 3)]
     public string MiddleName { get; set; }

     // ... etc
}
...