【asp源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了asp源码-ASP NET服务器控件开发 控件生命周期 - 互联网的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
ASP NET服务器控件开发 控件生命周期
ASP.NET 2.0服务器控件开发--控件生命周期 服务器控件生命周期简介 服务器控件的生命周期是创建服务器控件最重要的概念。
作为开发人员必须对服务器控件生命周期深刻理解。
当然这不是一朝一夕就可以做到的。
对于学习控件开发技术的初学者可以不必掌握得非常详细深入只需对服务器控件的生命周期中的不同阶段有一个大致的了解即可。
在掌握服务器控件生命周期的过程中读者要特别注意有关服务器控件状态的相关内容。
在重点了解生命周期各个阶段的同时对服务器控件的状态变化要注意以下问题控件的生命周期何时保存控件和恢复其状态何时与页面及其他控件之间进行交互何时执行重要的处理逻辑在各个阶段控件可使用哪些信息、保持哪些数据、控件呈现时处于哪种状态以及何时输出显示标记文本等。
如下列举了服务器控件生命周期所要经历的11个阶段。
1初始化----在此阶段中主要完成两项工作一、初始化在传入Web请求生命周期内所需的设置二、跟踪视图状态。
首先页面框架通过默认方式引发Init事件并调用OnInit方法控件开发人员可以重写该方法为控件提供初始化逻辑。
此后页面框架将调用TrackViewState方法来跟踪视图状态。
需要注意的是多数情况下Control基类提供的TrackViewState方法实现已经足够了。
只有在控件定义了复杂属性时开发人员才可能需要重写TrackViewState方法。
2加载视图状态--此阶段的主要任务是检查服务器控件是否存在以及是否需要将其状态恢复到它在处理之前的请求结束的状态。
因此该过程发生在页面回传过程中而不是初始化请求过程。
在此阶段页面框架将自动恢复ViewState字典。
如果服务器控件不维持其状态或者它有能力通过默认方式保存其所有状态而使用ViewState字典那么开发人员则不必实现任何逻辑。
针对那些无法在ViewState字典中存储的数据类型或者需要自定义状态管理的情况开发人员可以通过重写LoadViewState方法来自定义状态的恢复和管理。
3处理回发数据--若要使控件能够检查客户端发回的窗体数据那么必须实现System.Web.UI.IPostBackDataHandler接口的LoadPostData方法。
因此只有处理回发数据的控件参与此阶段。
4加载--至此阶段开始控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。
此时开发人员可以通过重写OnLoad方法来实现每个请求共同的逻辑。
5发送回发更改通知--在此阶段服务器控件通过引发事件作为一种信号表明由于回发而发生的控件状态变化因此该阶段仅用于回发过程。
为了建立这种信号开发人员必须再次使用System.Web.UI.IPostBackDataHandler接口并实现另一方法-RaisePostBackChangedEvent。
其判断过程为如果控件状态因回发而更改则LoadPostData返回true否则返回false。
页面框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent。
6处理回发事件--该阶段处理引起回发的客户端事件。
为了便于将客户端事件映射到服务器端事件上进行处理开发人员在此阶段可以通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent方法来实现该逻辑。
由此途径服务器控件将成功捕获回发的客户端事件进行服务器端的相应处理。
7预呈现--该阶段完成在生成控件之前所需要的任何工作。
通常情况下是通过重写OnPreRender方法完成该工作。
需要注意的是在该阶段可以保存在预呈现阶段对控件状态所做的更改而在呈现阶段进行的更改则会丢失。
8保存状态--如果服务器控件不维持状态或者它有能力通过默认方式保存其所有状态而使用ViewState字典那么开发人员不必在该阶段实现任何逻辑。
因为这个保存状态的过程是自动的。
如果服务器控件需要自定义状态保存或者控件无法在ViewState字典中存储特殊的数据类型则需要通过重写SaveViewState方法来实现状态保存。
9呈现--表示向HTTP输出流中写入标记文本的过程。
开发人员通过重写Render方法使其在输出流上自定义标记文本。
10处置--在此阶段中通过重写Dispose方法完成释放对昂贵资源的引用如数据库链接等。
11卸载--完成的工作与处置阶段相同但是开发人员通常在Dispose方法中执行清除而不处理Unload事件。
小结 服务器控件在
ASP.NET 2.0框架中起着举足轻重的作用是构建Web应用程序最关键、最重要的组成元素。
对于一个优秀的开发人员掌握服务器控件的基础知识是非常重要的。
本文就服务器控件的概念、类型、生命周期等关键内容进行了介绍。
希望读者能够将这些内容牢固掌握为写出精彩的服务器控件打下良好的基础 ---
ASP.NET应用程序生命周期概述 本主题概述应用程序生命周期列出重要的生命周期事件并描述如何编写适合应用程序生命周期的代码。
在
ASP.NET中若要对
ASP.NET应用程序进行初始化并使它处理请求必须执行一些处理步骤。
此外
ASP.NET只是对浏览器发出的请求进行处理的Web服务器结构的一部分。
了解应用程序生命周期非常重要这样才能在适当的生命周期阶段编写代码达到预期的效果。
应用程序生命周期概述 下表描述了
ASP.NET应用程序生命周期的各个阶段。
阶段说明 用户从Web服务器请求应用程序资源。
ASP.NET应用程序的生命周期以浏览器向Web服务器对于
ASP.NET应用程序通常为IIS发送请求为起点。
ASP.NET是Web服务器下的ISAPI扩展。
Web服务器接收到请求时会对所请求的文件的文件扩展名进行检查确定应由哪个ISAPI扩展处理该请求然后将该请求传递给合适的ISAPI扩展。
ASP.NET处理已映射到其上的文件扩展名如.aspx、.ascx、.ashx和.asmx。
注意 如果文件扩展名尚未映射到
ASP.NET则
ASP.NET将不会接收该请求。
对于使用
ASP.NET身份验证的应用程序理解这一点非常重要。
例如由于.htm文件通常没有映射到
ASP.NET因此
ASP.NET将不会对.htm文件请求执行身份验证或授权检查。
因此即使文件仅包含静态内容如果希望
ASP.NET检查身份验证也应使用映射到
ASP.NET的文件扩展名创建该文件如采用文件扩展名.aspx。
注意 如果要创建服务于特定文件扩展名的自定义处理程序必须在IIS中将该扩展名映射到
ASP.NET还必须在应用程序的Web.config文件中注册该处理程序。
有关更多信息请参见HTTP处理程序介绍。
ASP.NET接收对应用程序的第一个请求。
当
ASP.NET接收到对应用程序中任何资源的第一个请求时名为ApplicationManager的类会创建一个应用程序域。
应用程序域为全局变量提供应用程序隔离并允许单独卸载每个应用程序。
在应用程序域中将为名为HostingEnvironment的类创建一个实例该实例提供对有关应用程序的信息如存储该应用程序的文件夹的名称的访问。
下面的关系图说明了这种关系
ASP.NET接收对应用程序的第一个请求。
如果需要
ASP.NET还可对应用程序中的顶级项进行编译其中包括App_Code文件夹中的应用程序代码。
有关更多信息请参见本主题后面的编译生命周期。
为每个请求创建
ASP.NET核心对象。
创建了应用程序域并对HostingEnvironment对象进行了实例化之后
ASP.NET将创建并初始化核心对象如HttpContext、HttpRequest和HttpResponse。
HttpContext类包含特定于当前应用程序请求的对象如HttpRequest和HttpResponse对象。
HttpRequest对象包含有关当前请求的信息包括Cookie和浏览器信息。
HttpResponse对象包含发送到客户端的响应包括所有呈现的输出和Cookie。
将HttpApplication对象分配给请求 初始化所有核心应用程序对象之后将通过创建HttpApplication类的实例启动应用程序。
如果应用程序具有Global.asax文件则
ASP.NET会创建Global.asax类从HttpApplication类派生的一个实例并使用该派生类表示应用程序。
注意 第一次在应用程序中请求
ASP.NET页或进程时将创建HttpApplication的一个新实例。
不过为了尽可能提高性能可对多个请求重复使用HttpApplication实例。
创建HttpApplication的实例时将同时创建所有已配置的模块。
例如如果将应用程序这样配置
ASP.NET就会创建一个SessionStateModule模块。
创建了所有已配置的模块之后将调用HttpApplication类的Init方法。
下面的关系图说明了这种关系 将HttpApplication对象分配给请求 由HttpApplication管线处理请求。
在处理该请求时将由HttpApplication类执行以下事件。
希望扩展HttpApplication类的开发人员尤其需要注意这些事件。
对请求进行验证将检查浏览器发送的信息并确定其是否包含潜在恶意标记。
有关更多信息请参见ValidateRequest和脚本侵入概述。
如果已在Web.config文件的UrlMappingsSection节中配置了任何URL则执行URL映射。
引发BeginRequest事件。
引发AuthenticateRequest事件。
引发PostAuthenticateRequest事件。
引发AuthorizeRequest事件。
引发PostAuthorizeRequest事件。
引发ResolveRequestCache事件。
引发PostResolveRequestCache事件。
根据所请求资源的文件扩展名在应用程序的配置文件中映射选择实现IHttpHandler的类对请求进行处理。
如果该请求针对从Page类派生的对象页并且需要对该页进行编译则
ASP.NET会在创建该页的实例之前对其进行编译。
引发PostMapRequestHandler事件。
引发AcquireRequestState事件。
引发PostAcquireRequestState事件。
引发PreRequestHandlerExecute事件。
为该请求调用合适的IHttpHandler类的ProcessRequest方法或异步版BeginProcessRequest。
例如如果该请求针对某页则当前的页实例将处理该请求。
引发PostRequestHandlerExecute事件。
引发ReleaseRequestState事件。
引发PostReleaseRequestState事件。
如果定义了Filter属性则执行响应筛选。
引发UpdateRequestCache事件。
引发PostUpdateRequestCache事件。
引发EndRequest事件。
生命周期事件和Global.asax文件 在应用程序的生命周期期间应用程序会引发可处理的事件并调用可重写的特定方法。
若要处理应用程序事件或方法可以在应用程序根目录中创建一个名为Global.asax的文件。
如果创建了Global.asax文件
ASP.NET会将其编译为从HttpApplication类派生的类然后使用该派生类表示应用程序。
HttpApplication进程的一个实例每次只处理一个请求。
由于在访问应用程序类中的非静态成员时不需要将其锁定这样可以简化应用程序的事件处理过程。
这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。
例如可以在Global.asax文件中定义一个属性然后为该属性赋一个特定于请求的值。
通过使用命名约定Application_event如Application_BeginRequestASP.NET可在Global.asax文件中将应用程序事件自动绑定到处理程序。
这与将
ASP.NET页方法自动绑定到事件如页的Page_Load事件的方法类似。
有关详细信息请参见
ASP.NET页生命周期概述。
Application_Start和Application_End方法是不表示HttpApplication事件的特殊方法。
在应用程序域的生命周期期间
ASP.NET仅调用这些方法一次而不是对每个HttpApplication实例都调用一次。
下表列出在应用程序生命周期期间使用的一些事件和方法。
实际远不止列出的这些事件但这些事件是最常用的。
事件或方法说明 Application_Start 请求
ASP.NET应用程序中第一个资源如页时调用。
在应用程序的生命周期期间仅调用一次Application_Start方法。
可以使用此方法执行启动任务如将数据加载到缓存中以及初始化静态值。
在应用程序启动期间应仅设置静态数据。
由于实例数据仅可由创建的HttpApplication类的第一个实例使用所以请勿设置任何实例数据。
Application_ event 在应用程序生命周期中的适当时候引发请参见本主题前面的应用程序生命周期表中列出的内容。
Application_Error可在应用程序生命周期的任何阶段引发。
由于请求会短路因此Application_EndRequest是唯一能保证每次请求时都会引发的事件。
例如如果有两个模块处理Application_BeginRequest事件第一个模块引发一个异常则不会为第二个模块调用Application_BeginRequest事件。
但是会始终调用Application_EndRequest方法使应用程序清理资源。
HttpApplication.Init 在创建了所有模块之后对HttpApplication类的每个实例都调用一次。
Dispose 在销毁应用程序实例之前调用。
可使用此方法手动释放任何非托管资源。
有关更多信息请参见清理非托管资源。
Application_End 在卸载应用程序之前对每个应用程序生命周期调用一次。
编译生命周期 在第一次对应用程序发出请求时
ASP.NET按特定顺序编译应用程序项。
要编译的第一批项称为顶级项。
在第一次请求之后仅当依赖项更改时才会重新编译顶级项。
下表描述编译
ASP.NET顶级项的顺序。
项说明 App_GlobalResources 编译应用程序的全局资源并生成资源程序集。
应用程序的Bin文件夹中的任何程序集都链接到资源程序集。
App_WebResources 创建并编译Web服务的代理类型。
所生成的Web引用程序集将链接到资源程序集如存在。
Web.config文件中定义的配置文件属性 如果应用程序的Web.config文件中定义了配置文件属性则生成一个包含配置文件对象的程序集。
App_Code 生成源代码文件并创建一个或更多个程序集。
所有代码程序集和配置文件程序集都链接到资源和Web引用程序集如果有。
Global.asax 编译应用程序对象并将其链接到所有先前产生的程序集。
在编译应用程序的顶级项之后
ASP.NET将根据需要编译文件夹、页和其他项。
下表描述编译
ASP.NET文件夹和项的顺序。
项说明 App_LocalResources 如果包含被请求项的文件夹包含App_LocalResources文件夹则编译本地资源文件夹的内容并将其链接到全局资源程序集。
各个网页.aspx文件、用户控件.ascx文件、HTTP处理程序.ashx文件和HTTP模块.asmx文件 根据需要编译并链接到本地资源程序集和顶级程序集。
主题、主控页、其他源文件 在编译引用页时编译那些页所引用的各个主题、主控页和其他源代码文件的外观文件。
编译后的程序集缓存在服务器上并在后续请求时被重用并且只要源代码未更改就会在应用程序重新启动之间得到保留。
由于应用程序在第一次请求时进行编译所以对应用程序的初始请求所花的时间会明显长于后续请求。
可以预编译应用程序以减少第一次请求所需的时间。
有关更多信息请参见如何预编译
ASP.NET网站。
Application Restarts应用程序重新启动的次数 修改Web应用程序的源代码将导致
ASP.NET把源文件重新编译为程序集。
当修改应用程序中的顶级项时应用程序中引用顶级程序集的其他所有程序集也会被重新编译。
此外修改、添加或删除应用程序的已知文件夹中的某些类型的文件将导致应用程序重新启动。
下列操作将导致应用程序重新启动 添加、修改或删除应用程序的Bin文件夹中的程序集。
添加、修改或删除App_GlobalResources或App_LocalResources文件夹中的本地化资源。
添加、修改或删除应用程序的Global.asax文件。
添加、修改或删除App_Code目录中的源代码文件。
添加、修改或删除配置文件配置。
添加、修改或删除App_WebReferences目录中的Web服务引用。
添加、修改或删除应用程序的Web.config文件。
当应用程序需要重新启动时
ASP.NET将在重新启动应用程序域和加载新的程序集之前从现有应用程序域和旧的程序集中为所有挂起的请求提供服务。
HTTP模块
ASP.NET应用程序生命周期可通过IHttpModule类进行扩展。
ASP.NET包含若干实现IHttpModule的类如SessionStateModule类。
您还可以自行创建实现IHttpModule的类。
如果向应用程序添加模块模块本身会引发事件。
通过使用modulename_eventname约定应用程序可以在Global.asax文件中预订这些事件。
例如若要处理FormsAuthenticationModule对象引发的Authenticate事件可以创建一个名为FormsAuthentication_Authenticate的处理程序。
默认情况下
ASP.NET中会启用SessionStateModule类。
所有会话事件将自动命名为Session_event如Session_Start。
每次创建新会话时都会引发Start事件。
有关更多信息请参见会话状态概述。
本文来自CSDN博客转载请标明出处 特别声明 1资料来源于互联网版权归属原作者 2资料内容属于网络意见与本账号立场无关 3如有侵权请告知立即删除。