我有以下类(不介意命名空间):
[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的属性都是null。
OperationContract是:
[OperationContract]
[WebInvoke(UriTemplate = "Invoke2",RequestFormat=WebMessageFormat.Xml , ResponseFormat=WebMessageFormat.Xml)]
void Invoke2(ReqBody2 req);
这是我使用Fiddler发布的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属性,但它们在服务器上为空。
有关为什么会发生这种情况的任何线索?
答案 0 :(得分:2)
您发布的文档的默认名称空间定义为:
xmlns="http://www.test.com/ReqBody2"
这意味着除非指定,否则所有子元素都将继承此XML命名空间。这包括Req
元素,该元素将被反序列化为ReqBody2Internal
类型的元素。
但是,ReqBody2Internal
类型的名称空间声明为http://www.test.com/ReqBodyInternal
。这意味着期望子XML元素来自此命名空间以正确地解除分区,但它们继承了默认命名空间,因此被序列化程序视为“错误”元素。
要解决此问题,您需要更改数据协定上的命名空间声明以共享相同的命名空间,或更改XML以指定Req
元素的子元素的正确命名空间。