使用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>
<![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>
我知道这是由XML序列化程序将其作为字符串输入引起的,因此会转义标记。
但是我该如何解决这个问题呢? WSDL已将其定义为字符串,我真的想使用服务引用,但我不知道如何处理这个... 更改服务不是一种选择。
任何建议都会受到关注:)
答案 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;
}
}