XML 服务响应错误处理的最佳做法



我正在与一些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);
    }

在此解决方案中,至少有两个缺点:

  1. 我们在错误处理程序中有一些逻辑
  2. 我们应该将错误代码和有时的消息与"错误白名单"匹配,该列表允许我们只返回 NULL,并且在没有要返回的情况下不会抛出异常。

当然,这个解决方案是有效的,但我真的很想知道也许有一些最佳实践,我们可以如何处理单个xml请求的不同xml响应?

附言请注意,我正在集成的XML服务可能会返回代码为1的错误,例如真正的异常,例如:错误的登录和空的搜索结果。

我会建议这样的事情:

<FindSmthResponse>
   <Header>
      <Errors>
          <Error>
              <Code>0</Code>
              <Detail>Success</Detail>
          </Error>
      </Errors>
   </Header>
   <SomeResults>...</SomeResults>
</FindSmthResponse>

如果您正在使用标头定义,您甚至可以将其创建为自己的 xsd,然后可以在任何服务中使用它。只需让您的元素扩展服务标头,然后当您查看时,您可以反序列化整个事情,然后检查逻辑的不同部分是否存在错误。

最新更新