如何在 .Net 中的 WCF 客户端 Web 服务调用中包含 CDATA 部分?
How do I include a CDATA section in a WCF client webservice call in .Net?
我被要求创建一个 wcf 客户端来访问我无法修改的自定义 java 网络服务。我需要使用像这样的网络服务方法:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<createDocument xmlns="http://www.dummyUrl.com/javaws">
<version>
...
<metadata>
<attribute name="ConfigName">ConfigurationTemplateForModuleX</attribute>
<attribute name="ConfigValue">This is a configuration string</attribute>
</metadata>
...
</version>
</createDocument>
</s:Body>
</s:Envelope>
在属性 "ConfigValue" 中,我通常需要保存字符串,但我还需要能够将节点内的整个 XML 文档保存为 CDATA,例如:
...
<metadata>
<attribute name="ConfigName">ConfigurationTemplateForModuleX</attribute>
<attribute name="ConfigValue">
<![CDATA[
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config>
<title>Config Template for Module X</title>
...
</config>
]]>
</attribute>
</metadata>
...
我创建了一个指向我的 Visual Studio 项目的服务引用到此 Web 服务,并且创建了代理 类,我可以按照第一个代码部分中的描述使用该 Web 服务,但问题是我想包含在请求中的 CDATA 是自动编码的,因此不再可用,因为我无法更改目标 web 服务:
<![CDATA[
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config>
<title>Config Template for Module X</title>
...
</config>
]]>
我需要以某种方式修改 XML-Text 属性的序列化,或抑制编码。
你有什么办法解决这个问题吗?
将 XML 转换为 Base64 字符串并传输。在接收端进行简单的重新转换将为您提供正确的 XML 字符串。
一个不是很好但有效的解决方案是修改生成的 C# 服务引用。在类型的部分 class 中,我看到类似这样的内容:
public partial class tKeyValuePair : object, System.ComponentModel.INotifyPropertyChanged
{
private string keyField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string key
{
get
{
return this.keyField;
}
set
{
this.keyField = value;
this.RaisePropertyChanged("key");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
this.RaisePropertyChanged("Value");
}
}
提示!我使用以下命令行创建了引用,因为生成的代码与 Visual Studio 服务引用不同:
svcutil http://server/service?wsdl /nologo /d:C:\temp\ /enableDataBinding /wrapped
当我将“public string Value”和“private string valueField”的参考代码修改为 XmlNode[] 类型时,可以通过 C# 代码创建一个 XmlNode 数组,其中一个 XmlNode具有 Text 的内容或 CDATA 的内容,例如:
XmlNode test = new XmlCDataSection("text in cdata");
如果您打算包含有效的 XML 作为 CData,这也适用。
我被要求创建一个 wcf 客户端来访问我无法修改的自定义 java 网络服务。我需要使用像这样的网络服务方法:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<createDocument xmlns="http://www.dummyUrl.com/javaws">
<version>
...
<metadata>
<attribute name="ConfigName">ConfigurationTemplateForModuleX</attribute>
<attribute name="ConfigValue">This is a configuration string</attribute>
</metadata>
...
</version>
</createDocument>
</s:Body>
</s:Envelope>
在属性 "ConfigValue" 中,我通常需要保存字符串,但我还需要能够将节点内的整个 XML 文档保存为 CDATA,例如:
...
<metadata>
<attribute name="ConfigName">ConfigurationTemplateForModuleX</attribute>
<attribute name="ConfigValue">
<![CDATA[
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config>
<title>Config Template for Module X</title>
...
</config>
]]>
</attribute>
</metadata>
...
我创建了一个指向我的 Visual Studio 项目的服务引用到此 Web 服务,并且创建了代理 类,我可以按照第一个代码部分中的描述使用该 Web 服务,但问题是我想包含在请求中的 CDATA 是自动编码的,因此不再可用,因为我无法更改目标 web 服务:
<![CDATA[
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config>
<title>Config Template for Module X</title>
...
</config>
]]>
我需要以某种方式修改 XML-Text 属性的序列化,或抑制编码。
你有什么办法解决这个问题吗?
将 XML 转换为 Base64 字符串并传输。在接收端进行简单的重新转换将为您提供正确的 XML 字符串。
一个不是很好但有效的解决方案是修改生成的 C# 服务引用。在类型的部分 class 中,我看到类似这样的内容:
public partial class tKeyValuePair : object, System.ComponentModel.INotifyPropertyChanged
{
private string keyField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string key
{
get
{
return this.keyField;
}
set
{
this.keyField = value;
this.RaisePropertyChanged("key");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
this.RaisePropertyChanged("Value");
}
}
提示!我使用以下命令行创建了引用,因为生成的代码与 Visual Studio 服务引用不同:
svcutil http://server/service?wsdl /nologo /d:C:\temp\ /enableDataBinding /wrapped
当我将“public string Value”和“private string valueField”的参考代码修改为 XmlNode[] 类型时,可以通过 C# 代码创建一个 XmlNode 数组,其中一个 XmlNode具有 Text 的内容或 CDATA 的内容,例如:
XmlNode test = new XmlCDataSection("text in cdata");
如果您打算包含有效的 XML 作为 CData,这也适用。