c# - 如何在 .Net 中的 WCF 客户端 Web 服务调用中包含 CDATA 部分?

标签 c# .net web-services wcf cdata

我被要求创建一个 wcf 客户端来访问我无法修改的自定义 java web 服务。我需要使用像这样的网络服务方法:

<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 服务,但问题是我想包含在请求是自动编码的,因此不再可用,因为我无法更改目标网络服务:

 &lt;![CDATA[
   &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;
   &lt;config&gt;
     &lt;title&gt;Config Template for Module X&lt;/title&gt;
     ...
   &lt;/config&gt;
 ]]&gt;

我需要以某种方式修改 XML-Text 属性的序列化,或抑制编码。

你有什么想法可以解决这个问题吗?

最佳答案

一个不是很好但有效的解决方案是修改生成的 C# 服务引用。在类型的部分类中,我看到类似这样的内容:

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 包含在内,这也适用。

关于c# - 如何在 .Net 中的 WCF 客户端 Web 服务调用中包含 CDATA 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30773810/

相关文章:

c# - 用于 3D 球体绘图的最佳 .NET 图形库?

.net - 实现通用 Web 服务 API 的最佳方式

c# - 为什么 typeof(Child<>).BaseType.IsGenericTypeDefinition 是假的?

java - 如何使用 REST Web 服务器维护登录状态?

c# - 如何确定在 TableLayoutPanel 中单击的单元格?

c# - 使用 C++ 中的 COM 对象,在 C#.NET 中返回对象 []

c# - python.net:无法使用 winforms 加载 python27.dll,但控制台应用程序可以工作

.net - 多处理器和多核之间的区别

java - CXF 冲突 Xerces 依赖项

java - JAX-RS 2.0 API 支持调用其客户端