使用HttpApplication实例(翻译)

使用HttpApplication实例

在应用程序的整个生命周期,ASP.NET都会维护一个由Global.asax派生(Global.asax-derived)出来的HttpApplication实例的池.当应用程序接到一个http请求,asp.net页面框架就会指派其中的一个HttpApplication实例来处理请求.这个特定的HttpApplication实例会负责管理这个请求的整个生命周期.这个实例也只能在当前请求完成后才可以被重用.通过HttpApplication类你可以通过编程的方式来访问HttpApplication.InitHttpApplication.Dispose 方法以及Application_OnStart Application_OnEnd 事件,并且你可以访问HttpModule的一些公开事件.(:msdnIHttpModule相关文档中可以看到这个接口只有两个公开的方法接口一个是Dispose另一个是Init.)

重写InitDispose方法

HttpApplication.Init 方法在创建一个HttpApplication类的新实例后马上就触发.你可以使用这个方法来创建和配置任何你想在所有处理事件(l handling events)中使用的对象,看下面的代码实例.

[Visual Basic]

<script language="VB" runat="server">
 Public Overrides Sub Init()
'Insert something interesting here.
 End Sub
</script>

[C#]
<script language="C#" runat="server">
public override void Init()
 {
 // Insert something interesting here.
}
</script>

Init方法和Application_OnStart事件是不同的,因为在应用程序的所有HttpApplication实例都会调用它.Application_OnStart在应用程序的整个生命周期中只触发一次,也就是在第一个HttpApplication实例创建的时候触发.Application_OnStart只是用来创建或者修改所有管道实例(pipeline instances)共享的状态,比如使用ApplicationState对象.不用使用它创建局部变量,因为局部变量不能被多个HttpApplication实例共享. HttpApplication.Dispose 方法在一个HttpApplication类的实例被销毁的时候马上触发.它可以用来清理任何本地资源(local resources). Dispose方法和Application_OnEnd事件也不相同,因为它可以被整个应用程序中所有的HttpApplication实例调用. Application_End在整个应用程序的生命周期中只调用一次,也就是在最后一个HttpApplication实例被销毁的时候触发. Application_OnEnd只能用来清理被所有管道实例共享的状态或者资源.,比如ApplicationState对象.不要用它来清理局部变量,因为局部变量并不是被多个HttpApplication共享的.你不能使用在InitDispose中使用HttpApplication实例的Request, Response, Session .

下面的例子演示了如何重写由HttpApplication基类提供的这两个生命周期方法(two life cycle methods).

 [Visual Basic]

<script language="VB" runat=server>
Public Overrides Sub Init()
 ' Init override code goes here.
End Sub

Public
Overrides Sub Dispose()
' Init override code goes here.
End Sub
</script>

[C#]
<script language="C#" runat=server>
public override void Init()
{
// Init override code goes here.
}

public override void Dispose()
{
// Init override code goes here.
}
</script>

处理HttpApplication的事件

你可以使用Global.asax文件同步由HttpApplication 基类提供得任何事件.要实现这个,你必须使用下面的命名模式来书写一个方法.

Application_EventName(AppropriateEventArgumentSignature)

例如,如果你想让代码对应用程序中的OnStart, BeginRequest, OnEnd事件做出响应.Global.asax文件中的代码看起来是这样的.

[Visual Basic]

<Script language="VB" runat="server">
Sub Application_OnStart()
'Application start-up code goes here.
End Sub

Sub Application_BeginRequest()
'Application code for each request could go here.
End Sub

Sub
Application_OnEnd()
'Application clean-up code goes here.
End Sub
</script>

[C#]
<Script language="C#" runat="server">
public void Application_OnStart()
{
// Application start-up code goes here.
}

public
void Application_BeginRequest()
{
// Application code for each request could go here.
}

public
void Application_OnEnd()
{
// Application clean-up code goes here.
}
</script>

阅读原文(Working with HttpApplication instances)
posted @ 2007-05-25 13:25  zhanqiangz(闲云野鹤)  阅读(1535)  评论(0编辑  收藏  举报