首页 > 解决方案 > 如何防止序列化程序用 CDATA 包围字符串

问题描述

我正在寻找一种方法来停止我的 Web API 中的序列化程序以用 CDATA 标记括起来一个字符串。我的 Soap 服务使用正文中的转义字符串字段来保存 xml 文档。远程 SoapService 不理解和处理包含 CDATA 的字符串,因此我需要找到一种方法来告诉它不要将其包含在内,或者找到一种在发送之前将其删除的方法。

`<System.Web.Services.Protocols.SoapHeaderAttribute("AuthHeaderValue"), System.Web.Services.Protocols.SoapHeaderAttribute("tMLHeaderValue"),System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace:="java:lsr.webservice.wisor.com", ResponseNamespace:="java:lsr.webservice.wisor.com", Use:=System.Web.Services.Description.SoapBindingUse.Literal)>  _

Public Function processSyncRequest(ByVal [string] As String) As <System.Xml.Serialization.XmlElementAttribute("response")> String
Dim results() As Object = Me.Invoke("processSyncRequest", New Object() {[string]})
Return CType(results(0),String)
End Function`

用 CDATA 创建这个主体

<string xmlns=""><![CDATA[&lt;localserviceporequest xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns=&quot;http://www.synchronoss.com/lsr/FTR_PO&quot;&gt;
&lt;addressvalidation&gt;
&lt;ccna&gt;XD1&lt;/ccna&gt;
&lt;txnum /&gt;
&lt;dtsent /&gt;
&lt;tos /&gt;
&lt;ctval /&gt;
&lt;location&gt;
  &lt;route /&gt;
  &lt;aft&gt;N&lt;/aft&gt;
  &lt;sano&gt;1100&lt;/sano&gt;
  &lt;sasf /&gt;
  &lt;sasd&gt;S&lt;/sasd&gt;
  &lt;sasn&gt;Coast&lt;/sasn&gt;
  &lt;sath&gt;Hwy&lt;/sath&gt;
  &lt;sass /&gt;
  &lt;city&gt;Beach&lt;/city&gt;
  &lt;state&gt;CA&lt;/state&gt;
  &lt;zip&gt;90000&lt;/zip&gt;
&lt;/location&gt;
&lt;/addressvalidation&gt;
&lt;/localserviceporequest&gt;]]></string>

标签: xmlvb.netsoap

解决方案


希望我的发现能帮助其他人,而不是在这个问题上浪费大量时间。我的问题是两个方面。一方面,我在代码中使用了SecurityElement.Escape(myString)来确保我的字符串已保存。然后,当我将字符串传递给我的肥皂调用时,系统试图再次清理它,这似乎是一种默认行为,导致“<”变成 int a <,远端无法理解并导致错误。第二个问题是我的字符串中存在 CDATA 标记,我认为这是我的问题的根源,但事实证明它确实不是 sting 的一部分,但 ReadyAPI 在 XML 视图中显示了它。在我去生之后,我发现它不存在。


推荐阅读