2013-06-26 47 views
1

我需要一些關於web服務中異常處理策略的建議。有關webservice異常處理的建議

我的web服務方法正在針對Oracle數據庫執行標準的CRUD操作。因此,我有一些方法可以選擇數據並返回一個數據集和其他可以執行插入/更新/刪除操作但不返回任何內容的數據集。

最初,我在try-catch-finally中每個webservice方法中都有我的代碼來捕獲Oracle異常。我在網上閱讀了一些文章,說這樣做不好,我應該只圍繞着嘗試抓住的東西,如果有潛在的例外。現在我想,如果我只在try-catch-finally塊中放入我的Insert/Update/Delete方法,最好是這樣。

所以我的問題是:

  1. 我應該把我的的try-catch-最後所有的方法?它們都與Oracle進行交互,並可能導致異常。或者我應該只爲插入/更新和刪除方法?

  2. 我真的沒有什麼要求,當他們想發生異常時發生。我只是常識。我知道他們肯定不希望應用程序結束。我打算以某種方式記錄異常情況並將其重新投放到客戶端。當出現Oracle異常時,我正在執行此操作。

+0

ASMX是一項傳統技術,不應該用於新開發。 WCF應該用於Web服務客戶端和服務器的所有新開發。一個暗示:微軟已經在MSDN上退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)。 –

回答

1

我假設您正在使用ASP.NET WebMethods。我的建議是,你總是在服務層上捕獲異常,編寫日誌並拋出SoapException。基本上你可以嘗試每種服務方法(WebMethod)。如果你沒有這樣做,你會暴露異常的細節給調用服務的客戶端,這可能是一個潛在的安全問題。

2

基本上你需要嘗試每個WebMethod。由於這個事件不會起泡,我認爲沒有其他更好的辦法。

但是,您可以使用這個post中的技巧讓您的生活更輕鬆。

他的方式是創建一個像這樣的實用程序方法,並通過將委託傳遞給您的Web方法邏輯來調用該方法。

private T Execute<T>(Func<T> body) 
{ 
    //wrap everything in common try/catch 
    try 
    { 
     return body(); 
    } 
    catch (SoapException) 
    { 
     //rethrow any pre-generated SOAP faults 
     throw; 
    } 
    catch (ValidationException ex) 
    { 
     //validation error caused by client 
     ClientError innerError = new ClientError(); 
     //TODO: populate client error as needed 
     //throw SOAP fault 
     throw this.GenerateSoapException(
      "An error occurred while validating the client request.", 
      SoapException.ClientFaultCode, 
      innerError); 
    } 
    catch (Exception ex) 
    { 
     //everything else is treated as an error caused by server 
     ServerError innerError = new ServerError(); 
     //TODO: populate server error as needed 
     //TODO: log error 
     //throw SOAP fault 
     throw this.GenerateSoapException(
      "An unexpected error occurred on the server.", 
      SoapException.ServerFaultCode, 
      innerError); 
    } 
}