Asp.net 在Global.asax上使用IHttpModule

Asp.net 在Global.asax上使用IHttpModule,asp.net,vb.net,global-asax,ihttpmodule,Asp.net,Vb.net,Global Asax,Ihttpmodule,我被赋予了重新编写异常处理系统的激动人心的任务。虽然我将指出,从应用程序范围的角度处理异常并不是我们想要的,但通常,当我们的团队人员不足,无法完成我们需要推出的大量工作时,这是不可避免的,因此,请不要在这里使用异常处理的全球化解决方案:) 我已经找到了一个很好的办法,看看有什么共同的解决办法。此时,我们将Global.asax与Application_Error event to do Server.GetLastError()一起使用,该服务器处于会话状态,然后调用重定向到另一个页面,在该页面

我被赋予了重新编写异常处理系统的激动人心的任务。虽然我将指出,从应用程序范围的角度处理异常并不是我们想要的,但通常,当我们的团队人员不足,无法完成我们需要推出的大量工作时,这是不可避免的,因此,请不要在这里使用异常处理的全球化解决方案:)

我已经找到了一个很好的办法,看看有什么共同的解决办法。此时,我们将Global.asax与Application_Error event to do Server.GetLastError()一起使用,该服务器处于会话状态,然后调用重定向到另一个页面,在该页面中检索会话数据并以人类可读的格式输出。重定向还调用了一个存储过程,该过程将仔细审核错误信息,这些信息是a)通过电子邮件发送给开发人员的,b)从只有开发人员可以查看的网页上查看的

我看到的一种新方法是使用IHttpModule接口,使用App_代码中的类来执行这些操作(这是我的快速实现)

我的问题是,与使用Global.asax事件相比,此解决方案有什么好处?此外,将数据传递到错误页面的最佳方式是什么

编辑:顺便说一下,上面的代码确实有效;)

编辑:另外,HttpModule在幕后是如何工作的?它是否只是在应用程序启动时将错误事件注册到该特定函数

更新:


经过进一步的调查,在使用IHttpModule接口时,抓取会话数据似乎真的非常混乱。我认为MS的HttpModule还不够成熟,无法在我们的特定场景中使用——除非出现特定于会话数据的事件,否则使用它对我们来说太危险了。

HttpModule
基本上与
Global.asax
做相同的事情。它被设计为一个更可重用和自包含的事件处理模块。

使用模块具有易于移除的优点,要禁用它,只需将其从配置中移除即可

就您的数据而言,尝试使用或-这将保留所有当前数据(包括上一个服务器错误)

如果出于某种原因清除了最后一个错误,您可以在传输/重写之前将错误保存到,然后在传输/重写之后检索它


编辑:为了响应您的编辑,IHTTP模块会附加到其实现中的任何适当事件。

是否可以使用HttpModule代替Global.asax?或者Global.asax必须始终存在,即使它不做任何事情?Global.asax不需要存在。如果不使用它,将使用默认的HttpApplication类(而不是Global.asax中继承的类),但我在HttpModule中似乎找不到任何与会话启动相关的内容-不支持吗?您可以通过以下方式访问该事件:((SessionStateModule)application.Modules[“Session”])斯塔蒂先生几天前问了一个相关的问题。看见
Imports Microsoft.VisualBasic

Public Class ErrorModule : Implements IHttpModule

  Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
    ' Not used
  End Sub

  Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
    AddHandler context.Error, AddressOf context_Error
  End Sub

  Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
    Dim ex As Exception = HttpContext.Current.Server.GetLastError

    ' do something with the error
    ' call the stored procedure
    ' redirect the user to the error page

    HttpContext.Current.Server.ClearError()
    HttpContext.Current.Response.Redirect("index.htm")

  End Sub
End Class