2014-12-04 75 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狀態碼來傳遞響應格式。 – 2014-12-04 15:36:01

+0

是的,這是一個好主意,我會向所有開發人員推薦返回HTTP代碼500的錯誤,但在我的情況下,服務返回HTTP代碼爲200的XML錯誤。 – 2014-12-05 20:54:51

回答

0

我建議是這樣的:

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

你甚至可以創建頭定義它自己的XSD如果你使用它們,然後它可以在任何你的服務的使用。只需讓你的元素擴展服務頭,然後當你看到你可以反序列化整個事物,然後檢查邏輯的不同部分是否有錯誤。