Могут ли службы WCF REST поддерживать десериализацию сообщений XML с произвольным порядком элементов? - PullRequest
6 голосов
/ 14 января 2009

У меня есть служба CEST WCF REST, которая позволяет добавлять закладки, отправляя запрос HTTP POST с закладкой, сериализованной в XML. Я указал контракт на обслуживание для службы, которая подбирает xml и автоматически десериализует объект для меня. Моя проблема заключается в том, что десериализация работает правильно только в том случае, если элементы XML в запросе заданы в алфавитном порядке, а значения любых элементов, которые не в порядке, не заполняются.

Это поведение было сообщено в других местах .

Я считаю это довольно неудовлетворительным; Я считаю, что требование создавать XML в определенном порядке не является обязательным, и это является большой головной болью. Это основное требование, которое необходимо добавить ко всем клиентам службы, и источник потенциально сложных проблем для отладки.

Можно ли указать WCF как независимый от порядка XML-элементов?


Некоторые дополнительные сведения для уточнения:

Мой рабочий контракт выглядит так:

[OperationContract]
[WebInvoke(Method="POST", UriTemplate = "/{username}/bookmarks", ResponseFormat = WebMessageFormat.Xml)]
public void PostBookmark(string username, RestBookmark newBookmark);

RestMessage выглядит следующим образом:

[DataContract(Name = "Bookmark", Namespace = "")]
public class RestBookmark
{   
    [DataMember]
    public string BookmarkMd5 { get; set; }

    [DataMember]
    public string Url { get; set; }

    [DataMember]
    public string UserName { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Description { get; set; }
}

Если я отправлю следующее XML-сообщение, при вызове PostBookmark () будет заполнено только свойство UserName объекта RestMessage:

<?xml version="1.0"?><Bookmark><UserName>nick.street</UserName><Url>http://www.stackoverflow.com</Url><BookmarkMd5>f184eb3347cf94f6ce5f5fc2844e3bdd</BookmarkMd5><Description>Developer Forum</Description><Title>Stack Overflow</Title></Bookmark>

Ответы [ 4 ]

1 голос
/ 15 января 2009

DataContractSerializer требует строгого упорядочения элементов как для управления версиями, так и для повышения производительности.

Есть несколько вариантов, которые я могу придумать,

  1. написать инспектор сообщений для переупорядочения необработанных элементов XML в AfterReceivedRequest до их десериализации с помощью dataContractSerializer.

  2. с использованием XmlSerializer для ваших услуг.

  3. разработка процесса обработки HTTP-сообщений в формате XML сервис вместо.

  4. передать объект как словарь (не рекомендуется)

0 голосов
/ 15 января 2009

Если вы не собираетесь указывать Order в своем атрибуте DataMember, чтобы отразить порядок узлов, то вы должны расположить по алфавиту узлы в вашем XML.

0 голосов
/ 14 января 2009

Я не пытался сделать это сам, но я сделаю предположение.

Поможет ли это создать событие [OnDeserializing] в вашем DataContract, которое сработает непосредственно перед десериализацией? В этот момент, возможно, вы могли бы изменить порядок XML, однако его необходимо упорядочить, чтобы десериализация работала должным образом.

Если у вас есть услуги WCF для Juval Lowy's 2nd Edition, это описано на стр. 107.

Вот страница справки MSDN .

0 голосов
/ 14 января 2009

Попробуйте установить для Order значение 0 в атрибуте DataMember (для всех членов):

[DataMember (Name = "Title", Order = 0)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...