1

次のクラスがあります(名前空間は気にしないでください):

[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 属性にアクセスできることですが、それらはサーバー上では null です。

なぜこれが起こっているのかについての手がかりはありますか?

4

1 に答える 1

2

投稿されるドキュメントには、次のように定義されたデフォルトの名前空間があります。

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

これは、指定しない限り、すべての子要素がこの XML 名前空間を継承することを意味します。これには、Reqtype の要素に逆シリアル化される要素が含まれReqBody2Internalます。

ただし、ReqBody2Internal型には として宣言された名前空間がありますhttp://www.test.com/ReqBodyInternal。つまり、子 XML 要素は、正しく非シリアル化するためにこの名前空間からのものであることが期待されますが、既定の名前空間を継承するため、シリアライザーによって "間違った" 要素と見なされます。

これを修正するには、データ コントラクトの名前空間宣言を変更して同じ名前空間を共有するか、XML を変更して要素の子要素に正しい名前空間を指定する必要がありますReq

于 2013-04-04T15:11:43.803 に答える