最佳实践-从Web服务抛出异常

3
我们有一个 ASMX Web 服务,我们使用 ajax (jQuery) 从我们的 ASP.NET 应用程序中调用它。
我们的 Web 方法的典型示例可能是这样的:
[WebMethod]
public void DoSomething(BusinessObject myParameter)
{

    try
    {
       BL.DoSomethingWithParam(myParameter);
    }
    catch(Exception ex)
    { 
        //logic to log the actual exception goes here
        //and then we throw a more user-friendly error as so:
        throw new Exception("Unable to perform action such an such");
    }
}

在客户端,我们会有类似以下的代码:
$.ajax({
   type: "POST",
   url: "WebService.asmx/DoSomething",
   data: "{}",
   contentType: "application/json; charset=utf-8",
   dataType: "json",
   success: function(result) {
      //do something with result.d
    },
   error: function(xhr, ajaxOptions, thrownError){ 
      alert($.parseJSON(xhr.Response.Text).Message);
   }
});

以上方法存在几个问题,我希望解决:
  1. 当我们在本地测试应用时,在我们的web方法中抛出的新异常行上Internet Explorer显示实际的错误消息(在提供的示例代码的情况下:“无法执行某些操作”),但是当我们部署到阶段环境并进行远程测试时,它不再显示我们抛出的错误,而是显示如下信息:"There has been an error processing your request."
  2. 在Firefox上(我们没有测试更多的浏览器),它根本不显示任何东西,但 Firebug 显示 HTTP 500 错误被抛出。

总之,我们没有适当地处理这个问题,因此我的问题是:

  1. 最好的方式是如何将这些错误传达给客户端,并在所有浏览器中保持一致的行为,同时在本地和远程测试时都能保持一致?
  2. 为什么IE没有像Firefox那样崩溃?当在远程测试时,IE也会崩溃,因为它没有显示真正的错误消息,而是将其替换为通用的 There has been an error processing your request,但为什么Firefox没有做同样的事情?
  3. 考虑到该Web服务还将被公司内其他Java Web应用程序使用,最好的方法是如何与这些应用程序保持互操作性?我们如何在Web方法中抛出这些异常,并使Java应用程序能够捕获并适当处理它们?

我们实现的一个替代方案(目前,我们仍处于开发阶段)只是在错误发生时从我们的Web方法返回一个字符串,但这真的是一种丑陋的hack /不优雅的方法来解决这个问题。

注意:别问我“"There has been an error processing your request"消息来自哪里。 我一点也不知道。 我们的代码中没有任何返回该消息的内容。

1个回答

6
我不知道是否已经出现了“正确”的方式,因为Web服务的使用方式正在如此迅速地变化,最终,构建用于消费服务的任何客户端都能够处理您选择的任何方法。我毫不怀疑最终会开发出一种方法,但现在取决于您。
话虽如此,请尽量避免过去我看到的一些常见陷阱。
1.缺乏一致性:如果您的Web服务有多个方法,请设计一种方式,使它们都可以以相同的方式通信以使您的方法更容易被消费。个人而言,我喜欢跟随协议栈的脚步,使用某种一致的头部。使用公共头部构建结果消息,以便可以在客户端代码中使用相同的逻辑确定方法调用是否成功。
2.不支持多个错误消息:有时会发生多个故障。将客户端遮盖第二个错误可能会很麻烦,并减慢调试尝试的速度。
3.缺少错误消息的标识:如果错误是特定字段无效导致的,请允许客户端根据您提供的信息编程识别是哪个字段有问题。
我通常从以下方面入手:
```html

这些日子我一般的做法如下:

```
{
    Success: bool,
    Errors[]: {
        Id: string,
        Source: string,
        Message: string
    },
    Message: { *Method specific structure* }
}

谢谢你的建议。确实非常有用! - Icarus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接