我们有一个 ASMX Web 服务,我们使用 ajax (jQuery) 从 ASP.NET 应用程序调用它。
我们的网络方法的典型示例如下:
[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);
}
});
上述方法有几个问题,我想解决:
- 当我们在本地机器上测试应用程序时,Internet Explorer 会显示我们在 Web 方法的 throw new Exception 行上抛出的实际错误消息(在提供的示例代码的情况下:“无法执行此类操作”)BUT当我们部署到舞台环境并远程测试时;它不再显示我们抛出的错误,而是显示:
"There has been an error processing your request."
- 在 Firefox 上(我们没有测试更多浏览器),它根本不显示任何内容,但 Firebug 显示抛出了 HTTP 500 错误。
总之,我们没有适当地处理这个问题,所以我的问题是:
- 在本地和远程测试时,将这些错误传达给客户端并在所有浏览器之间保持一致的行为的最佳方法是什么?
- 为什么 IE 不像 Firefox 那样崩溃?当然,远程测试 IE 也会出现一些问题,即不显示真正的错误消息并将其替换为通用错误消息
There has been an error processing your request
但为什么 Firefox 不这样做呢?
- 考虑到该 Web 服务也将被公司内的其他 Java Web 应用程序使用,那么维持与这些应用程序的互操作性的最佳方法是什么?我们怎样才能在 Web 方法上抛出这些异常,并让 Java 应用程序能够捕获它们并进行适当的处理?
我们实现的一种替代方案(目前仍处于开发阶段)是在发生错误时从 Web 方法返回一个字符串,但这确实是一种丑陋的黑客/不优雅的方法。
Note:不要问我“处理您的请求时出错”消息来自哪里。我一点儿想法也没有。我们的代码中没有任何内容可以返回该消息。