【问题标题】:Advice on exception handling in webservice关于 webservice 中异常处理的建议
【发布时间】:2013-06-26 19:47:29
【问题描述】:

我需要一些关于我的网络服务中良好的异常处理策略的建议。

我的 Web 服务方法正在对 Oracle 数据库执行标准的 CRUD 操作。因此,我有一些方法可以选择数据并返回数据集,而另一些方法可以执行插入/更新/或删除并且不返回任何内容。

最初,我将每个 web 服务方法中的所有代码都放在 try-catch-finally 中,以捕获 Oracle 异常。我在网上读到一些文章说这不好,如果有可能出现异常,我应该只在 try-catch 中包含一些东西。现在我在想,如果我只将我的 Insert/Update/Delete 方法放在 try-catch-finally 块中,也许会是最好的。

所以我的问题是:

  1. 我应该把我所有的方法都放在 try-catch-finally 中吗?它们都与 Oracle 交互,并可能导致异常。还是我应该只对插入/更新和删除方法执行此操作?

  2. 当异常发生时,我对他们想要发生的事情没有任何要求。我只是说常识。我知道他们绝对不希望应用程序结束。我计划以某种方式记录异常并将其重新抛出给客户端。当出现 Oracle 异常时,我会这样做。

【问题讨论】:

  • ASMX 是一项遗留技术,不应用于新开发。 WCF 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:Microsoft 已停用 MSDN 上的 ASMX Forum

标签: asp.net web-services asmx


【解决方案1】:

基本上,您需要对每个 WebMethod 进行 try-catch。由于事件不会冒泡,我认为没有其他更好的方法。

但是,您可以使用post 中的技巧让您的生活更轻松。

他的做法是创建一个这样的实用方法,并通过将委托传递给您的网络方法逻辑来调用该方法。

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);
    }
}

【讨论】:

    【解决方案2】:

    我假设您使用的是 ASP.NET WebMethods。我的建议是你总是在服务层捕获异常,写一个日志并抛出一个 SoapException。基本上,您可以尝试捕获每种服务方法(WebMethod)。如果您不这样做,您将向调用该服务的客户端公开异常详细信息,这可能是一个潜在的安全问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多