2014-12-04 6 views
1

Я работаю над нашей системной интеграцией с некоторой службой 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); 
    } 

Но, как вы можете видеть из моего примера ответа об ошибке выше, не все ошибки являются плохими, некоторые из них просто говорят, что возвращаться нечего. Вот почему в таком месте, где я обрабатывать эту ошибку, я должен добавить то вроде этого:

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?

p.s. обратите внимание, что служба XML, с которой я интегрируюсь, может вернуть ошибку с кодом 1 как для реального исключения, например: неправильный логин и пустой результат поиска.

+1

Это HTTP-сервис? Если это так, я бы предпочел полагаться на коды состояния HTTP, чтобы передать формат ответа. –

+0

Да, это хорошая идея, и я бы рекомендовал всем разработчикам вернуть HTTP-код 500 для ошибок, но в моем случае ошибка возврата службы в XML с кодом HTTP 200. –

ответ

0

Я хотел бы предложить что-то вроде этого:

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

Вы можете даже создать определение заголовка, как это собственный XSD, если вы их используете, и она может быть использована через любой из ваших услуг. Просто добавьте свой элемент в заголовок службы, а затем, когда вы смотрите, вы можете десериализовать всю вещь, а затем проверить, есть ли ошибки в другой части вашей логики.

Смежные вопросы