对于Web服务的输出,我有以下场景(输出的类型是字符串,但字符串的内容是XML)。
当服务未成功时,输出为:
<root>
<exec_id>2053c884-beec-4c33-af64-bce8c4a8601c</exec_id>
<ERROR_CODE>-13</ERROR_CODE>
<OUTPUT_XML>Policy GO Period is mistaken (Mar 9 2016 8:43PM, Mar 6 2017 11:59PM)</OUTPUT_XML>
</root>
当服务返回某些内容时,响应为:
<root>
<exec_id>9a506024-8996-4f17-bcc4-a4616b2c28da</exec_id>
<ERROR_CODE>0</ERROR_CODE>
<OUTPUT_XML>
<root>
<ProposalNo>000334374</ProposalNo>
<InsPremium>225.40</InsPremium>
<InsDuePremium>241.310</InsDuePremium>
<FeesInfo>
<Fee>
<PaymentDate>2016-03-09T16:08:34.613</PaymentDate>
<FeeSum>241.31</FeeSum>
<FeeSumCurCode>BGN</FeeSumCurCode>
<AgencyCode>001</AgencyCode>
</Fee>
</FeesInfo>
<ERROR_MSG>Успешно изпълнена процедура</ERROR_MSG>
</root>
</OUTPUT_XML>
</root>
因此,基于此,我创建了一个包含exec_id和ERROR_CODE的基类,因为它们对所有响应都是通用的。现在问题是OUTPUT_XML,因为它每次都是一个不同的对象,所以我为每个服务方法都有一个后继类。问题是服务在OUTPUT_XML中返回错误消息。我的问题是如何以最佳方式处理这个问题?
答案 0 :(得分:0)
您的服务是否受您控制? (不确定这是否是一个约束。) 在上述两种情况下,没有任何属性允许对XML进行开箱即用的反序列化。你可以编写一些自定义序列化,但这样就太过分了。
如果服务是你的,那么你可以定义一个响应类并序列化它。如果你可以序列化它,那么你可以反序列化它。然后在您的响应XML中,输出和的元素是错误消息的元素,而不是一个可能包含任何元素的元素。 XML的内容应该更具可预测性。这就是我们使用模式的原因。但是使用类来序列化和反序列化可以完成同样的事情。 XML是可预测的。
您还可以获取<OUTPUT_XML>
节点的InnerXml属性,如果它以<root>
开头,则反序列化该字符串是一个单独的XML文档。这是合乎逻辑的,因为这是他们实际给你的东西 - 一个XML文档作为XML文档中的字符串。
或者,正如所说的,如果错误代码是可靠的指标,那么你可以先读取它。