基于WCF RestFul服务的XML反序列化

本文关键字:XML 反序列化 服务 WCF RestFul 基于 | 更新日期: 2023-09-27 18:07:29

我有以下类(不介意命名空间):

[DataContract(Namespace = "http://www.test.com/ReqBody2")]
[KnownType(typeof(ReqBody2))]
public class ReqBody2
{
    [DataMember]
    public string pass { get; set; }
    [DataMember]
    public int Tout { get; set; }
    [DataMember]
    public string RequestDate { get; set; }
    [DataMember]
    public ReqBody2Internal Req { get; set; }
    [DataMember]
    public string ReqEnc { get; set; }
}
[DataContract(Namespace = "http://www.test.com/ReqBodyInternal")]
[KnownType(typeof(ReqBody2Internal))]
public class ReqBody2Internal
{
    [DataMember]
    public string Field1 { get; set; }
    [DataMember]
    public string Field2 { get; set; }
    [DataMember]
    public string Field3 { get; set; }
    [DataMember]
    public string Field4 { get; set; }
}

当我发布ReqBody2的Xml序列化时,服务正确地接收并反序列化对象的根属性。然而,ReqBody2Internal的属性都是空的。

OperationContract是:

[OperationContract]
[WebInvoke(UriTemplate = "Invoke2",RequestFormat=WebMessageFormat.Xml , ResponseFormat=WebMessageFormat.Xml)]
void Invoke2(ReqBody2 req);

这是一个示例Xml我张贴使用提琴:

<?xml version="1.0" encoding="utf-8"?><ReqBody2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com/ReqBody2">
<pass>HOLA</pass>
<Req><Field1>asd</Field1><Field2>asd</Field2><Field3>asd</Field3><Field4>extra value</Field4></Req>
<RequestDate>2013-04-04T14:10:38</RequestDate>
<Tout>30000</Tout>
</ReqBody2>

我期望发生的是可以访问Req属性,但它们在服务器上是空的。

关于为什么会发生这种情况有任何线索吗?

基于WCF RestFul服务的XML反序列化

要发布的文档有一个默认命名空间,定义为:

xmlns="http://www.test.com/ReqBody2"

这意味着除非指定,否则所有子元素都将继承此XML名称空间。这包括Req元素,它将被反序列化为ReqBody2Internal类型的元素。

然而,您的ReqBody2Internal类型有一个声明为http://www.test.com/ReqBodyInternal的命名空间。这意味着子XML元素应该来自这个名称空间,以便正确地序列化,但它们继承了默认名称空间,因此被序列化器视为"错误"的元素。

要解决这个问题,需要更改数据契约中的名称空间声明以共享相同的名称空间,或者更改XML以为Req元素的子元素指定正确的名称空间。