2011-05-24 46 views
1

我们可以使用名称Application_End()从global.asax文件创建方法附加到此事件。但我需要像这样附加如何处理来自外部的Application_End事件global.asax

HttpContext.ApplicationInstance.ApplicationEnd+=OnApplicationEnd; 

有没有办法做到这一点?

+0

我在[MSDN](http:// msd)中看不到ApplicationEnd事件n.microsoft.com/en-us/library/system.web.httpapplication.aspx)。 – Amy 2011-05-24 14:03:10

+0

你想从外部global.asax处理Application_End事件吗? – 2011-05-24 14:11:24

回答

4

有这样解决了问题。

public class MyHttpApplication:HttpApplication 
    { 
     public event Action ApplicationEnd; 
     protected void Application_End() 
     { 
      if (ApplicationEnd != null) 
       ApplicationEnd(); 
     } 
    } 

在Global.asax中的代码定义

<%@ Application Inherits="MyLib.MyHttpApplication" Language="C#" %> 

然后

var app = HttpContext.ApplicationInstance as MyHttpApplication; 
app.ApplicationEnd +=() => { // do something }; 
3

Application_End是一个特殊的“事件”,由Asp.net调用,不会记录到HttpApplication类。

来自MSDN * Application_Start和Application_End方法是不代表HttpApplication事件的特殊方法。 ASP.NET称他们一旦应用程序域的生命周期,而不是每一个HttpApplication实例。*

我认为你可以有相同的行为,并连接到处理器的AppDomain.DomainUnload事件

//your global.asax class contrauctor 
public GlobalApplication() 
     { 

      AppDomain.CurrentDomain.DomainUnload += ApplicationEnd; 
     } 


     private void ApplicationEnd(object sender, EventArgs e) 
     { 

     } 
+0

已经试过。您只能从其他AppDomain处理DomainUnload事件,而不是从激发它的域中处理DomainUnload事件,因为它在卸载整个域数据后触发,并且不会调用事件处理程序。 – mironych 2011-05-24 14:16:37

+0

我测试过了,它工作正常。 在处理程序处添加一个断点 运行网站 在web配置中添加一个空白区域并保存它以强制卸载它将被调用的appdomain – 2011-05-24 14:37:58

0

我知道答案已经给出,但想也包括这样:

[assembly: PreApplicationStartMethod(typeof(Bootstraper), "Start")] 
[assembly: ApplicationShutdownMethod(typeof(Bootstraper), "End")] 
public static class Bootstraper 
{ 
    public static void End() 
    { 
     ... 
    } 
    public static void Start() 
    { 
     ... 
    } 
} 
相关问题