簡體   English   中英

如何在 .Net 中的 WCF 客戶端 Web 服務調用中包含 CDATA 部分?

[英]How do I include a CDATA section in a WCF client webservice call in .Net?

我被要求創建一個 wcf 客戶端,它訪問一個我無法修改的自定義 java web 服務。 我需要使用一個 webservice 方法,如:

<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 項目的服務引用到這個 webservice 並創建了代理類,我可以使用第一個代碼部分中描述的 webservice,但問題是我想要包含在請求中的 CDATA 是自動的編碼,因此不再可用,因為我無法更改目標網絡服務:

 &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

當我將“公共字符串值”和“私有字符串值字段”的引用代碼修改為 XmlNode[] 類型時,可以通過 C# 代碼創建一個 XmlNode 數組,其中包含一個 XmlNode,該數組具有 Text 的內容或內容的 CDATA 像:

XmlNode test = new XmlCDataSection("text in cdata");

如果您打算將有效的 XML 作為 CData 包含在內,這也適用。

將 XML 轉換為 Base64 字符串並進行傳輸。 在接收端進行簡單的重新轉換將為您提供正確的 XML 字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM