是否可以在global.asax中捕获循环事件?
我知道Application_End会被触发,但有没有办法知道它是由应用程序池的循环触发的?
thx,Lieven Cardoen又名Johlero
我在Scott Guthries的博客上发现了这篇文章:
记录ASP.NET应用程序关闭事件
listserv上的某个人最近询问是否有办法找出ASP.NET重新启动应用程序域的原因和时间.具体来说,他正在寻找在生产共享托管环境中触发它们的应用程序的确切原因(是web.config文件更改,global.asax更改,app_code目录更改,目录删除更改,最大值-num-compilations达到了quota,\ bin目录更改等).
托马斯在我的团队中有一个很酷的代码片段,他写道,它使用了一些漂亮的私人反射技巧来捕获和记录这些信息.它很容易重复使用并添加到任何应用程序中,并可用于在任何地方记录信息(下面的代码使用NT事件日志来保存它 - 但您可以轻松地将其发送到数据库或通过电子邮件发送给管理员).该代码适用于ASP.NET V1.1和ASP.NET V2.0.
只需将System.Reflection和System.Diagnostics名称空间添加到Global.asax类/文件中,然后使用以下代码添加Application_End事件:
public void Application_End() { HttpRuntime runtime = (HttpRuntime) typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null); if (runtime == null) return; string shutDownMessage = (string) runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null); string shutDownStack = (string) runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null); if (!EventLog.SourceExists(".NET Runtime")) { EventLog.CreateEventSource(".NET Runtime", "Application"); } EventLog log = new EventLog(); log.Source = ".NET Runtime"; log.WriteEntry(String.Format( "\r\n\r\n_shutDownMessage={0}\r\n\r\n_shutDownStack={1}", shutDownMessage, shutDownStack), EventLogEntryType.Error); }