我正在开发与某些xml服务的系统集成,我想知道是否有任何最佳实践来处理代表错误的响应。 例如。我有一个要求:
<FindSmthPls>
<Login>MyLogin</Login>
<Password>MyPassword</Password>
<SomeAttributes>...</SomeAttribute>
</FindSmthPls>
并回复:
<FindSmthResponse>
<SomeResults>...</SomeResults>
</FindSmthResponse>
但是,如果xml服务以格式返回错误:
<Error>
<ErrorCode>1</ErrorCode>
<ErrorMessage>Sorry but we cannot find anything for your request!</ErrorMessage>
</Error>
我无法将xml反序列化为 FindSmthResponse ,这就是我必须在下一个方面处理错误的原因:
try
{
return Deserialize<T>(xml);
}
//for the cases when I cannot deserialize response
//I can assume that service returned an error
catch (InvalidOperationException ex)
{
var error = Deserialize<TError>(xml);
throw new XmlException(error);
}
但正如您从上面的错误响应示例中看到的那样,并非所有错误都是错误的,其中一些只是说没有任何回复。这就是为什么在我处理这个错误的地方,我应该像这样添加smth:
catch (XmlException e)
{
//workaround for cases when service returns errors like: result is empty
if (_safeErrors.Any(c =>
c.Key.Equals(e.XmlError.Code, StringComparison.InvariantCultureIgnoreCase) &&
c.Value.Equals(e.XmlError.Message, StringComparison.InvariantCultureIgnoreCase)))
{
return null;
}
throw new XmlApiException(e);
}
在此解决方案中至少有两个缺点:
当然这个解决方案有效但我真的想知道可能有一些最佳实践我们如何处理单个xml请求的不同xml响应?
P.S。请注意,我正在集成的XML服务可能会返回错误代码1,就像真正的异常一样:错误登录和空搜索结果。
答案 0 :(得分:0)
我会建议这样的事情:
<FindSmthResponse>
<Header>
<Errors>
<Error>
<Code>0</Code>
<Detail>Success</Detail>
</Error>
</Errors>
</Header>
<SomeResults>...</SomeResults>
</FindSmthResponse>
如果您正在使用它们,您甚至可以创建它自己的xsd标头定义,然后可以在任何服务中使用它。只需让您的元素扩展服务标题,然后在查看时可以反序列化整个事物,然后检查逻辑的不同部分是否存在错误。