2017-08-23 21 views
0

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

实际消息

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> 

我缺少什么或者是有什么办法可以通过“<”符号,而转型。正如我所说这是一个我们无法控制的第三方应用程序。感谢您的时间和答案。

+0

请参阅wiki以获取html特殊字符列表:https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references要正确使用:System.Net.WebUtility.HtmlDecode(string) – jdweng

回答

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;

你唯一的其他选择,我很害怕,是编写或者产生CDATA块(并且不允许]]>被传输)自己的SOAP/XML编码或格式不正确的XML与元素中间的<符号您的第三方应用程序可以理解的内容 - 但对于不能正确解析XML以理解元素内容中的<符号的应用程序,可能根本没有办法。

+0

感谢您的回答。我们正计划将<符号替换为[。我希望不应该有任何问题。没有CDATA。让我知道。 – Vinod

+0

为了以防万一,请替换'&'。它会变成'&' – Tim

+0

谢谢。我只是交叉检查,没有& – Vinod