我们有一个 ASMX Web 服务,我们使用 ajax (jQuery) 从我们的 ASP.NET 应用程序中调用它。
我们的 Web 方法的典型示例可能是这样的:
在客户端,我们会有类似以下的代码:
以上方法存在几个问题,我希望解决:
我们的 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);
}
});
以上方法存在几个问题,我希望解决:
- 当我们在本地测试应用时,在我们的web方法中抛出的新异常行上Internet Explorer显示实际的错误消息(在提供的示例代码的情况下:“无法执行某些操作”),但是当我们部署到阶段环境并进行远程测试时,它不再显示我们抛出的错误,而是显示如下信息:
"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方法返回一个字符串,但这真的是一种丑陋的hack /不优雅的方法来解决这个问题。
注意:别问我“"There has been an error processing your request"消息来自哪里。 我一点也不知道。 我们的代码中没有任何返回该消息的内容。