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

Less than symbol in web service response 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 块中表示。如果您的第 3 方应用程序没有正确解析转义序列,那么您可以假设它是由不理解 XML 的人编写的,并且很可能无论如何它都不理解 CDATA 块。

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

恐怕你唯一的选择是编写你自己的 SOAP/XML 编码器来生成 CDATA 块(并且不允许 ]]> 传输)或格式错误的 XML 在您的第 3 方应用程序可以理解的元素内容中间带有 < 符号——但对于未正确解析 XML 的应用程序来说,可能根本无法理解元素内容中的 < 符号。