65.9K
CodeProject 正在变化。 阅读更多。
Home

在 ASP.NET 中检查请求是同步还是异步

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.25/5 (3投票s)

2008年8月10日

CPOL

3分钟阅读

viewsIcon

28524

如何在启用 AJAX 的 ASP.Net 应用程序中检查请求的类型是同步还是异步?

引言

需求

我们使用 Asp.Net Framework 2.0、AJAX 和 VS 2005 开发了一个 Web 应用程序。在发布 VS 2008 和 .Net Framework 3.5 之后,我们将应用程序移植到 Asp.Net Framework 3.5。根据需要,我们还升级了符合 Asp.Net 3.5 的 AJAX 工具包。这导致了以下问题

在我们的应用程序中,我们按如下方式处理错误

  1. 如果普通(同步)请求中发生异常,我们会将用户重定向到通用错误页面。此代码写在 Global.asax 页面的 Application_Error 事件中。
  2. Code
  3. 如果异步请求中发生异常,我们让 AJAX 框架在其“ScriptManager1_AsyncPostBackError”事件中处理该错误。

在使用 Asp.Net 2.0 和 AJAX 的情况下,当异步请求执行期间抛出任何异常时,它会被“ScriptManager1_AsyncPostBackError”事件捕获,然后 AJAX 框架处理该异常并向用户显示 JavaScript 警报框。Global.asax 文件中的任何事件 (Application_Error) 都不会触发。

但是,在 Asp.Net 3.5 AJAX 中,他们更改了异常处理机制,现在“ScriptManager1_AsyncPostBackError”和 Global.asax 中的 Application_Error 事件都会被触发。

问题:现在,如果在异步请求的情况下发生异常,应用程序尝试将用户重定向到通用错误页面,而不是显示 JavaScript 警报,并最终导致另一个异常,因为 Redirect 在异步请求中是不允许的。哈.... Application_Error 方法中的异常 ;)。

可能的解决方案

在 Global.asax 的 Application_Error 方法中,检查请求的类型。如果是异步的,则不要重定向到通用错误页面,否则重定向到通用错误页面。(很简单,对吧!!)

但是,如何在 Global.asax 中检查请求的类型是同步还是异步?

  • HttpRequest 类中没有相关的属性。
  • ScriptManager 类中有一个名为 IsInAsyncPostBack 的属性,但由于它具有属性,因此我们无法浏览它

image

  • 此外,您无法在 Global.asax 中访问 ScriptManager :).

SOLUTION

如果您使用 reflector 检查设置 ScriptManagerIsInAsyncPostBack (我们无法浏览) 属性的代码,它看起来像

image

它正在调用 PageRequestManager 类(这是一个内部密封类)的 IsAsyncPostBackRequest 方法。因此,我们无法继承或扩展它。那么我们应该做什么?

添加扩展方法:这是解决方案。

所以,我们所做的是在 HttpRequest 类中添加了一个扩展方法,它可以完成这项工作。您可以在 这里找到一些关于扩展方法的详细信息和示例。

添加扩展方法的一些经验法则包括

  • 它应该是 static 方法,位于 static 类中。
  • this 关键字应该位于参数前面。

这是方法的实现,如下所示

image

现在,此方法是 HttpRequest 类的一部分,因此您可以像使用 HttpRequest 类的任何其他方法一样使用它。

使用代码

这是一个使用此扩展方法的代码片段(来自 Global.asax)

image

因此,现在我们可以检查请求是否为异步类型,然后才重定向到通用错误页面。问题解决了!!

通过这种方式,您现在可以在应用程序的任何位置检查请求是同步还是异步。

享受编程的乐趣!!!

关注点

我们经常遇到需要检查请求是同步还是异步的情况。奇怪的是:ASP.Net 没有在框架中提供此功能。

© . All rights reserved.