2

SOAP 応答を送信するために WCF で使用しているデータ型があります。次のようになります。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <start-call-recording-response xmlns="http://foobar">
         <response>true</response>
      </start-call-recording-response>
   </s:Body>
</s:Envelope>

問題は、名前空間 ( http://foobar) が要素に表示されないことです。つまり、XmlElementAttibute の名前空間を親クラスの XmlRootAttribute の名前空間とは異なるものに変更しない限りです。start-call-recording-response のクラスは次のとおりです。

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18033")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "StartcallrecordingresponseType")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://foobar", ElementName = "start-call-recording-responseType")]
public partial class StartcallrecordingresponseType
{
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://foobar")]
    private bool responseField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://foobar", ElementName = "response", IsNullable = false)]
    public bool Response
    {
        get
        {
            return this.responseField;
        }
        set
        {
            this.responseField = value;
        }
    }
}

Response の上にある XmlElementAttribute の名前空間を、それを含むクラスの名前空間以外のものに変更すると、SOAP エンベロープの . 同じ場合は表示されません。XmlTypeAttributes、XmlRootAttributes、および XmlElementAttributes の多くのバリエーションを試しました。

4

1 に答える 1

1

正解です。名前空間の仕様を参照してください

デフォルトの名前空間宣言のスコープは、それが現れる開始タグの先頭から、対応する終了タグの末尾まで拡張されます。内部のデフォルトの名前空間宣言のスコープは除外されます。空のタグの場合、スコープはタグ自体です。

そのため、応答要素はその start-call-recording-response 親から foobar 名前空間を継承します。

于 2013-03-22T23:30:15.023 に答える