如何设置DataContract以匹配WCF 4.0 REST服务中的复杂XML输入

时间:2011-11-19 10:17:11

标签: wcf rest

我有这样的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";
}

MessageDataContract类型,我设置如下:

[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 个答案:

答案 0 :(得分:1)

除了是一个非常糟糕的类名(因为它已经在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#类之间.....