2013-06-26 121 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); 
    } 
}