CDATA部分使用服务引用作为字符串

时间:2017-12-07 19:04:18

标签: c# xml web-services wsdl

使用c#和visual studio 2015

我正在使用外部Web服务,并且已使用交付的WSDL构建服务引用。这一切都有效,我可以调用该服务,但是我收到错误,因为请求格式不正确...

服务定义的一部分是:

<xsd:complexType name="GCTPLookupRequestType">
    <xsd:sequence>    
    <xsd:element name="gctpMessage" type="xsd:string" minOccurs="1" maxOccurs="1" />
    </xsd:sequence>  
  </xsd:complexType>

gctpMessage是一个字符串元素,但是应该包含这样的CDATA部分:

<![CDATA[
<Gctp v="1.0">
<System r="CprSoeg">
<Service r="STAM+">
<CprServiceHeader r="STAM+">
<Key>
<Field r="PNR" v="0000000000"/>
</Key>
</CprServiceHeader>
</Service>
</System>
</Gctp>
]]>

如果我把它作为字符串按预期添加到gctpMessage属性中似乎都很好,但是当我使用Fiddler检查请求时我认为它是完全错误的:

<gctpMessage>
&lt;![CDATA[&lt;Gctp v="1.0"&gt;&lt;System r="CprSoeg"&gt;&lt;
Service r="STAM+"&gt;&lt;CprServiceHeader r="STAM+"&gt;&lt;Key&gt;&lt;
Field r="PNR" v="0000000000"/&gt;&lt;/Key&gt;&lt;/CprServiceHeader&gt;&lt;/
Service&gt;&lt;/System&gt;&lt;/Gctp&gt;]]&gt;
</gctpMessage>

我知道这是由XML序列化程序将其作为字符串输入引起的,因此会转义标记。

但是我该如何解决这个问题呢? WSDL已将其定义为字符串,我真的想使用服务引用,但我不知道如何处理这个... 更改服务不是一种选择。

任何建议都会受到关注:)

1 个答案:

答案 0 :(得分:1)

完美的dbc,它就是诀窍:)。

谢谢你......

  [System.Xml.Serialization.XmlIgnore]
        public string gctpMessage {
            get {
                return this.gctpMessageField;
            }
            set {
                this.gctpMessageField = value;
                this.RaisePropertyChanged("gctpMessage");
            }
        }

        [System.Xml.Serialization.XmlElementAttribute(Order = 1, ElementName = "gctpMessage")]
        public XmlNode[] CDataContent
        {
            get
            {
                var dummy = new XmlDocument();
                return new XmlNode[] { dummy.CreateCDataSection(gctpMessage) };
            }
            set
            {
                if (value == null)
                {
                    gctpMessage = null;
                    return;
                }

                if (value.Length != 1)
                {
                    throw new InvalidOperationException(
                        String.Format(
                            "Invalid array length {0}", value.Length));
                }

                gctpMessage = value[0].Value;
            }
        }