小于Web服务响应中的符号c#

时间:2017-08-23 00:30:47

标签: c# xml web-services soap soapui

我正在使用C#创建一个由第三方应用程序使用的Web服务。我的一个响应值包含小于“<”符号,它被转换为“& lt”,看起来像java应用程序无法处理或无法将它们转换回“<”符号。当我在.Net应用程序中使用响应并显示值时,它工作正常。我试图添加CDATA,但没有按预期进行。

实际消息

 Date <X1> is too old.

添加CDATA的代码

response.Message= "<![CDATA[" + row.Message+ "]]>";

还试过

response.Message= "![CDATA[" + row.Message+ "]]";

没有CDATA(来自SoapUI的输出)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetMessageResponse xmlns="http://xxxx.com/">
         <GetMessageResult>
            <Message>Date &lt;X1> is too old.</Message>
         </GetMessageResult>
      </GetMessageResponse>
   </soap:Body>

使用CDATA(来自SoapUI的输出)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetMessageResponse xmlns="http://xxxx.com/">
            <Message>Date &lt;![CDATA[&lt;X1>]]&gt; is too old.</Message>
         </GetMessageResult>
      </GetMessageResponse>
   </soap:Body>

我错过了什么或者有没有办法通过“&lt;”没有转变的象征。正如我所说,它是第三方应用程序,我们没有任何控制权。感谢您的时间和答案。

1 个答案:

答案 0 :(得分:0)

将邮件编码为

<Message>Date &lt;X1> is too old.</Message>

是正确的编码。 SOAP库将对您的响应消息中的任何文本进行编码。尝试将其包装在CDATA中只是按照它应该的方式对XML进行编码,正如您所观察到的那样。

如果您没有将<编码为&lt;,那么它将不是有效的XML,它会认为<X1>是嵌套元素而不是文本。

如果你成功地强制框架使用CDATA编码而不是简单的XML转义序列来编码你的消息(某处可能有隐藏的设置,但我不熟悉它),即使CDATA也无法编码一切 - 特别是序列]]>无法在CDATA块中表示。如果你的第三方应用程序没有正确地解析转义序列,那么你可以认为它是由一个不理解XML的人编写的,很可能它不理解CDATA块。

如果您无法控制第三方应用程序并且它实际上无法正确解析XML,那么最好的办法是清理消息,使其不包含少于符号或符号,以避免编码问题。 &<符号必须以XML格式编码,但还有其他可选的转义序列,如果SOAP框架发出它们,您可能必须避免 - 例如&quot;&gt;

我担心的唯一其他选择是编写自己的SOAP / XML编码器,生成CDATA块(不允许]]>传输)或格式错误的XML {{1}您的第三方应用程序可以理解的元素内容中间的符号 - 但是对于不能正确解析XML的应用程序来说,可能根本无法理解元素内容中的<符号。