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



我正在用 C# 创建一个 Web 服务,该服务由 java 第三方应用程序使用。 我的一个响应值包含小于"<"符号,它被转换为"<",看起来 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>

我错过了什么,或者有什么方法可以在不转换的情况下传递"<"符号。正如我所说,这是一个第三方应用程序,我们无法控制。感谢您的时间和答案。

消息的编码为

<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,并在元素内容中间使用<符号,您的第三方应用程序可以理解 - 但是对于未正确解析 XML 的应用程序来说,可能根本无法<理解元素。

相关内容

  • 没有找到相关文章