当前位置:  开发笔记 > 后端 > 正文

IIS回收Global.asax

如何解决《IIS回收Global.asax》经验,为你挑选了1个好方法。

是否可以在global.asax中捕获循环事件?

我知道Application_End会被触发,但有没有办法知道它是由应用程序池的循环触发的?

thx,Lieven Cardoen又名Johlero



1> splattne..:

我在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);
}

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有