Как настроить DataContract для соответствия сложному XML-вводу в REST-службе WCF 4.0 - PullRequest
1 голос
/ 19 ноября 2011

У меня есть XML-структура, подобная этой:

<Message>
    <Messagehead>
        <OSType>Android</OSType>
        <RouteDest>SiteServerName</RouteDest>
        <ActionType>Enroll</ActionType>
    </Messagehead>
    <MessageBody>
        <Raw>
            <![CDATA[OrienginalMessageContent]]>
        </Raw>
    </MessageBody>
</Message>

, и я хочу загрузить этот XML в WCF 4.0, моя служба отдыха:

public string Enroll(Message instance)
{
    // TODO: Add the new instance of SampleItem to the collection
    return "success";
}

Message - это DataContract тип, я настраиваю его следующим образом:

[DataContract(Namespace = "")]
public class Message
{

    [DataMember]
    public MessageHead MessageHead { get; set; }

    [DataMember]
    public MessageBody MessageBody { get; set; }


}

public class MessageHead
{
    public OSType OSType { get; set; }

    public string RouteDest { get; set; }

    public Action Action { get; set; }
}

public class MessageBody
{

    public string RawRequestContent { get; set; }
}

, но когда я получаю экземпляр Message со стороны сервера, все свойства равны null, кроме OSType, может кто-нибудь сказать мнеЗачем?Как я мог решить эту проблему?

1 Ответ

1 голос
/ 19 ноября 2011

Помимо того, что у класса действительно плохое имя (поскольку он уже используется во время выполнения WCF), у вашего Message класса также есть некоторые недостатки:

<Message>
    <Messagehead>
       ....
    </Messagehead>

Ваш <Messagehead> имеет в нижнем регистре h в середине - но ваш класс определяет его в верхнем регистре:

[DataContract(Namespace = "")]
public class Message
{
    [DataMember]
    public MessageHead MessageHead { get; set; }

Это будет не работать - случай важен и актуален в сообщении WCF! Если ваш XML имеет строчную букву h, то и ваш DataContract класс!

Ваш XML также требует тега <Raw> внутри вашего <MessageBody>

<MessageBody>
   <Raw>
        <![CDATA[OriginalMessageContent]]>
   </Raw>
</MessageBody>

но ваш контракт на данные не учитывает это:

public class MessageBody
{
    public string RawRequestContent { get; set; }
}

Опять же - они не выстраиваются в очередь! Имена важны - и они должны совпадать между вашим XML-представлением сообщения и классом C #, представляющим это сообщение .....

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