如何在global.asax中捕获AJAX WebMethod的错误?

31 浏览
0 Comments

如何在global.asax中捕获AJAX WebMethod的错误?

我在我的ASP.net应用程序中使用了在global.asax中捕获错误的常见做法。在global.asax中,我有一个名为Application_Error的函数,将错误记录到数据库中。

这在记录用户请求页面时出现的错误方面非常有效。

然而,当从客户端调用的异步方法(一个使用[WebMethod]属性修饰的方法)抛出异常时,这对于帮助没有任何作用。异常只是继续传递并可能返回给客户端代码,但是我希望错误处理代码在服务器上自动运行,类似于在global.asax中记录页面错误的方式。

我该如何实现这个目标?一种方法是在每个异步方法中都使用try-catch包装,但这对我来说似乎不是一个好的解决方案。

0
0 Comments

在ASP.NET中,如果要捕获AJAX WebMethod的错误并记录下来,可以通过创建一个ASP.NET输出过滤器来实现。具体步骤如下:

1. 创建一个Stream的子类,用于捕获响应的内容。

2. 当流被关闭时,检查响应是否具有500状态码以及一个`"jsonerror: true"`的头部。如果是这样,说明响应包含一个WebMethod异常,将异常记录下来。

3. 在Global.Application_PostMapRequestHandler方法中,为JSON请求安装这个输出过滤器的实例。

完整的源代码可以参考这个StackOverflow的回答:https://stackoverflow.com/a/24222240/1127114

0
0 Comments

从上面的内容中,我们可以得出以下问题的原因和解决方法:

问题的原因:

之前的方法只适用于通过SOAP Web服务调用WebMethods,而不适用于通过AJAX GET/POST调用WebMethods。

问题的解决方法:

对于通过AJAX GET/POST调用WebMethods的情况,我们需要在global.asax中捕获错误,并进行处理。

以下是解决方法的具体步骤:

1. 在global.asax文件中,找到Application_Error事件处理程序。

2. 在该事件处理程序中,添加以下代码来捕获AJAX WebMethod的错误:

protected void Application_Error(object sender, EventArgs e)

{

// 获取最后一个错误

Exception ex = Server.GetLastError();

// 检查是否为AJAX WebMethod错误

if (ex is HttpException && Context.Request.HttpMethod == "POST")

{

// 获取错误状态码

int statusCode = (ex as HttpException).GetHttpCode();

// 检查是否为500错误

if (statusCode == 500)

{

// 处理AJAX WebMethod错误的代码

// 例如,可以将错误信息记录到日志文件中

}

}

}

3. 保存并重新启动应用程序。

通过以上步骤,我们可以在global.asax中捕获并处理通过AJAX GET/POST调用的WebMethods的错误。这样可以更好地监控和调试我们的应用程序,并及时处理错误。

0