Global.asax文件里的Application_Init能触发吗?

在项目中遇到一个bug,结果发现是因为把一些在整个web应用程序启动时应该执行的代码放到了Application_Init中,但是这个方法在web应用程序启动的过程中并没有触发.我用的环境是VSTS,不管是web site项目还是web application项目都是这样,也委托我的朋友在VS2003里做了验证,结果一样不能触发.你可以白度或者Google一下,关于Application_Init的文章很多,大多都说在web应用程序启动的时候触发,并且在整个生命周期只执行一次.下面的文章来源于网络:

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法。你可以使用这个文件实现应用程序安全性以及其它一些任务。
    Global.asax
文件被配置为任何(通过 URL 的)直接 HTTP 请求都被自动拒绝,所以用户不能下载或查看其内容。ASP.NET 页面框架能够自动识别出对Global.asax 文件所做的任何更改。在 Global.asax 被更改后ASP.NET 页面框架会重新启动应用程序,包括关闭所有的浏览器会话,去除所有状态信息,并重新启动应用程序域。


Global.asax
文件继承自HttpApplication 类,它维护一个HttpApplication 对象池,并在需要时将对象池中的对象分配给应用程序。Global.asax 文件包含以下事件:

·         Application_Init:在应用程序被实例化或第一次被调用时,该事件被触发。对于所有的HttpApplication 对象实例,它都会被调用。

·         Application_Disposed:在应用程序被销毁之前触发。这是清除以前所用资源的理想位置。

·         Application_Error:当应用程序中遇到一个未处理的异常时,该事件被触发。

·         Application_Start:在HttpApplication 类的第一个实例被创建时,该事件被触发。它允许你创建可以由所有HttpApplication 实例访问的对象。

·         Application_End:在HttpApplication 类的最后一个实例被销毁时,该事件被触发。在一个应用程序的生命周期内它只被触发一次。

·         Application_BeginRequest:在接收到一个应用程序请求时触发。对于一个请求来说,它是第一个被触发的事件,请求一般是用户输入的一个页面请求(URL)。

·         Application_EndRequest:针对应用程序请求的最后一个事件。

·         Application_PreRequestHandlerExecute:在 ASP.NET 页面框架开始执行诸如页面或 Web 服务之类的事件处理程序之前,该事件被触发。

·         Application_PostRequestHandlerExecute:在 ASP.NET 页面框架结束执行一个事件处理程序时,该事件被触发。

·         Applcation_PreSendRequestHeaders:在 ASP.NET 页面框架发送 HTTP 头给请求客户(浏览器)时,该事件被触发。

·         Application_PreSendContent:在 ASP.NET 页面框架发送内容给请求客户(浏览器)时,该事件被触发。

·         Application_AcquireRequestState:在 ASP.NET 页面框架得到与当前请求相关的当前状态(Session 状态)时,该事件被触发。

·         Application_ReleaseRequestState:在 ASP.NET 页面框架执行完所有的事件处理程序时,该事件被触发。这将导致所有的状态模块保存它们当前的状态数据。

·         Application_ResolveRequestCache:在 ASP.NET 页面框架完成一个授权请求时,该事件被触发。它允许缓存模块从缓存中为请求提供服务,从而绕过事件处理程序的执行。

·         Application_UpdateRequestCache:在 ASP.NET 页面框架完成事件处理程序的执行时,该事件被触发,从而使缓存模块存储响应数据,以供响应后续的请求时使用。

·         Application_AuthenticateRequest:在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证。

·         Application_AuthorizeRequest:当安全模块确认一个用户可以访问资源之后,该事件被触发。

·         Session_Start:在一个新用户访问应用程序 Web 站点时,该事件被触发。

·         Session_End:在一个用户的会话超时、结束或他们离开应用程序 Web 站点时,该事件被触发。

 

 

使用这些事件的一个关键问题是知道它们被触发的顺序。Application_Init Application_Start 事件在应用程序第一次启动时被触发一次。相似地,Application_Disposed Application_End 事件在应用程序终止时被触发一次。此外,基于会话的事件(Session_Start Session_End)只在用户进入和离开站点时被使用。其余的事件则处理应用程序请求,这些事件被触发的顺序是:

·         Application_BeginRequest

·         Application_AuthenticateRequest

·         Application_AuthorizeRequest

·         Application_ResolveRequestCache

·         Application_AcquireRequestState

·         Application_PreRequestHandlerExecute

·         Application_PreSendRequestHeaders

·         Application_PreSendRequestContent

·         <<执行代码>>

·         Application_PostRequestHandlerExecute

·         Application_ReleaseRequestState

·         Application_UpdateRequestCache

·         Application_EndRequest

这些事件常被用于安全性方面。下面这个 C# 的例子演示了不同的Global.asax 事件,该例使用Application_Authenticate 事件来完成通过 cookie 的基于表单(form)的身份验证。此外,Application_Start 事件填充一个应用程序变量,而Session_Start 填充一个会话变量。Application_Error 事件显示一个简单的消息用以说明发生的错误。

protected void Application_Start(Object sender, EventArgs e) {
Application["Title"] = "Builder.com Sample";
}
protected void Session_Start(Object sender, EventArgs e) {
Session["startValue"] = 0;
}
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie) {
// There is no authentication cookie.
return;
}
FormsAuthenticationTicket authTicket = null;
try {
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
} catch(Exception ex) {
// Log exception details (omitted for simplicity)
return;
}
if (null == authTicket) {
// Cookie failed to decrypt.
return;
}
// When the ticket was created, the UserData property was assigned
// a pipe delimited string of role names.
string[2] roles
roles[0] = "One"
roles[1] = "Two"
// Create an Identity object
FormsIdentity id = new FormsIdentity( authTicket );
// This principal will flow throughout the request.
GenericPrincipal principal = new GenericPrincipal(id, roles);
// Attach the new principal object to the current HttpContext object
Context.User = principal;
}
protected void Application_Error(Object sender, EventArgs e) {
Response.Write("Error encountered.");
}

网络上的资料大多是msdn文档的转载或者翻译,并且提供的例子里都没有对Application_Init的描述.
大家有对这个东东有经验的吗?欢迎在我的博客中留下你的见解.谢谢!

posted on 2007-06-07 11:07 zhanqiangz(闲云野鹤) 阅读(430) 评论(4)  编辑 收藏 所属分类: ASP.NET2.0读书笔记

评论

#1楼  2007-06-07 11:40 随心所欲      

自然是执行的,只是触发一次。
你之所以没有发现他的执行,可能是因为你测试的时候已经执行过了。基本上,他在第一次IIS处理的时候被调用,以后都不执行了。

有一个小窍门:web.config修改的时候整个webapp都会重新启动,那么你的这个事件就会触发了。   回复  引用  查看    

#2楼 [楼主] 2007-06-08 10:32 zhanqiangz(闲云野鹤)      

@随心所欲
自然是执行的,只是触发一次。
--->不知道这位兄弟,你尝试过没有,反正根据我的测试结果是没有执行的.

你之所以没有发现他的执行,可能是因为你测试的时候已经执行过了。基本上,他在第一次IIS处理的时候被调用,以后都不执行了。
--->我直接打了断点,在Application_Start的地方可以命中断点,但是在Application_Init永远不能命中,而且我是在按下F5 debug测试的,我想应用程序第一次启动,就是你所说的"第一次IIS处理"吧.

有一个小窍门:web.config修改的时候整个webapp都会重新启动,那么你的这个事件就会触发了
--->这个东东对解决这个问题帮助不大,呵呵.   回复  引用  查看    

#3楼  2007-06-08 12:03 随心所欲      

1:用过,的确执行
2:应用程序一次启动不代表是第一次启动。
3:这个小窍门用来重启程序,可以不必每次中止IIS就可以达到这个目的。对于你这种类型的测试很有用   回复  引用  查看    

#4楼 [楼主] 2007-06-08 16:01 zhanqiangz(闲云野鹤)      

@随心所欲
兄弟,可否把你的简单测试代码,操作步骤,以及使用的IDE和OS的信息(版本)详细说明一下.
小弟感激不尽.   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
 


<2007年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

公告

如转载本博客的相关资料敬请注明出处.谢谢合作!

与我联系

常用链接

留言簿(6)

我参与的团队

我的标签

随笔分类(51)

随笔档案(49)

文章分类(7)

文章档案(5)

收藏夹(3)

.NET

BizTalk

Design

JavaScript

My Blogs

Power Tools

Process Control

Search Engine

SQL Server

XML

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜