`

asp.net模型

 
阅读更多

asp.net 事件模型机制
-----------------------一
客户的请求页面由aspnet_isapi.dll这个动态连接库来处理, 把请求的aspx文件发送给CLR进行编译执行,然后把Html流返回给浏览器
--------------------------
页面事件
2.1 页面事件的执行顺序
Page_Init:初始化值或连接
Page_Load:主要使用IsPostBack,该事件主要执行一系 列得操作来首次创建asp.net页面或响应
由投递引起得客户端事件。在此事件之前,已还原页面和控件视图状态。
Page_DataBind: 在页面级别上调用,也可在单个控件中调用。
DataBind_PreRender:数据绑定预呈现,恰好在保存视图状态和呈现控件之前激发此事 件。
Page_Unload:此事件是执行最终清理工作的。
非确定事件
Page_Error:如果在页面处理过程中出现未处理的 例外,则激发error事件。
Page_AbortTransaction:交易事件,事务处理中如果已终止交易,则激发此事件,购物车常用。
Page_CommitTransaction: 如果已成功交易,则激发此事件。
2.2 Global.asax 中的事件(执行顺序)
Application_Start:应用程序启动时激发
Application_BeginRquest:http 请求开始时激发
Application_AuthenticateRequest:应用程序批准http请求时激发
Session_Start: 会话启动时激发
Application_EndRequest:Htttp请求结束时激发
Session_End:会话结束时激发
Application_End: 应用程序结束时激发
Application_Error: 发生错误时激发
ISAPI功能
ISAPI有两大功能:
1: 扩展——win32的动态链接库,譬如aspnet_isapi.dll,可以把ISAPI扩展看作是一个普通的应用程序,它处理的目标是HTTP请求;
2: 过滤器——web服务器把请求传递给相关的过滤器,接下来过滤器可能修改请求,执行某些操作等等
具体言之,IIS本身是不支持动态页面的,也就是说他仅仅支持静态HTML页面的内容,对于.asp| .aspx| .cgi| .php等,IIS并不知道如果处理这些后缀标记,它就会把它当作文本,丝毫不做处理发送到客户端。为了解决这个问题,IIS有一种机制,叫做ISAPI 的过滤器。它是一个COM组件。过滤器通过在IIS中配置应用程序扩展名来完成配置。
当IIS安装以后,默认的应用程序配置包含.asp、.aspx、.java、.css、.ascx等等常规扩展名。.asp扩展名对应的ISAPI是asp.dll,.aspx扩展名对应的ISAPI是aspnet_isapi.dll。这样当IIS接收到后缀名为.aspx的请求时,自己无法处理该请求,便读取ISAPI应用程序配置,寻找与.aspx对应的dll,即aspnet_isapi.dll,然后aspnet_isapi.dll进程开始处理代码,生成标准的HTML代码,生成后把这些代码加入到原有的HTML中,最后把完整的HTML返回给IIS,IIS再把内容发送到客户端。
ASP.NET请求的处理过程
基于管道模型,在模型中ASP.NET把http请求传递给管道中所有的HTTP模块(即:httpmodule)。每个模块都接收HTTP请求,并有完全的控制权。一旦请求经过了所有的HTTP模块,最终被HTTP处理程序处理。HTTP处理程序对请求进行一些处理,并且结果将再次经过模块管道中的HTTP模块。
ASPNET_ISAPI.DLL实现IIS过滤和扩展的方式
Aspnet_isapi.dll通过HttpModule(即管道模型中的HTTP模块)实现IIS过滤,通过HttpHandler(即HTTP处理程序)实现IIS扩展。
Http模块(HttpModule)实现了过滤器 (ISAPI filter)的功能,它在某些事件中注册,将自己插入到ASP.NET请求处理管道,从而能够对某些事件进行处理,最常用的事件有void Init(HttpApplication application)和void Dispose()。该模块是实现了System.Web.IHttpModule接口的.net组件。我们可以自定义类继承System.Web.IHttpModule接口,并方法Init(HttpApplication application)来处理请求。
HTTP处理程序(HttpHandler)实现了扩展(ISAPI Extention)的功能,它处理请求(Request)的信息和发送响应(Response),最常用的事件有void ProcessRequest(HttpContext context)和属性bool IsReusable。HTTP处理程序是实现System.Web.IHttpHandler接口的.NET组件。我们可以自定义类继承System.Web.IHttpHandler接口,并实现ProcessRequest(HttpContext context)方法和实现IsReusable属性,来处理请求信息并生成HTML内容。
ASP.NETHTTP请求处理流程
当客户端向web服务器请求一个*.aspx的页面文件时,这个http请求会被inetinfo.exe进程截获(www服务),它判断文件后缀之后,把这个请求转交给ASPNET_ISAPI.DLL,而 ASPNET_ISAPI.DLL则会通过一个Http PipeLine的管道,将这个http请求发送给ASPNET_WP.EXE进程,当这个HTTP请求进入ASPNET_WP.EXE进程之 后,asp.net framework就会通过HttpRuntime来处理这个Http请求,处理完毕后将结果返回给客户端。
当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:
HttpModule --> HttpHandler Factory --> HttpHandler
当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。
完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->
ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory--> HttpApplication-->
HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
在应用程序中实现IHttpModule接口
如果想在中途截获一个 httpRequest并做些自己的处理,就应该在HttpRuntime运行时内部来做到这一点,确切的说时在HttpModule这个容器中做到这个的。
7.1 ASP.NET系统中默认的HttpModule
系统本身的HttpModule实现一个IHttpModule的接口,当然我们自己的类也能够实现IHttpModule接口,这就可以替代系统的 HttpModule对象了。
ASP.NET系统中默认的HttpModule:
DefaultAuthenticationModule确保上下文中存在 Authentication 对象。无法继承此类。
FileAuthorizationModule验证远程用户是否具有访问所请求文件的 NT 权限。无法继承此类。
FormsAuthenticationModule 启用 ASP.NET 应用程序以使用 Forms 身份验证。无法继承此类。
PassportAuthenticationModule提供环绕 PassportAuthentication 服务的包装。无法继承此类。
SessionStateModule 为应用程序提供会话状态服务。
UrlAuthorizationModule 提供基于 URL 的授权服务以允许或拒绝对指定资源的访问。无法继承此类。
WindowsAuthenticationModule启用 ASP.NET 应用程序以使用 Windows/IIS 身份验证。无法继承此类
7.2 在我们的web应用程序中实现IHttpModule接口
这些系统默认的HttpModule是在文件 machine.config中配置的,和我们开发时使用到的web.config的关系是:是在ASP.NET FRAMEWORK启动处理一个Http Request的时候,它会依次加载machine.config和请求页面所在目录的web.config文件,如果在machine中配置了一个自己的HttpModule,你仍然可以在所在页面的web.config文件中添加自己的HttpModule,方法如下:
首先自定义类实现IHttpModule接口:
public class HelloWorldModule : IHttpModule
{
public HelloWorldModule()
{
}
public String ModuleName
{
get { return "HelloWorldModule"; }
}
// In the Init function, register for HttpApplication
// events by adding your handlers.
public void Init(HttpApplication application)
{
application.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
application.EndRequest +=
(new EventHandler(this.Application_EndRequest));
}
private void Application_BeginRequest(Object source,
EventArgs e)
{
// Create HttpApplication and HttpContext objects to access
// request and response properties.
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
}
private void Application_EndRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
}
public void Dispose()
{
}
}
其次在web.config中的根目录<configuration></configuration>中添加如下配置:
<system.web>
<httpModules>
<add name="HelloWorldModule" type="namespace.HelloWorldModule, AssemblyName"/>
</httpModules>
</system.web>
这里的name属性值自定义,而type属性值则包含两个信息:namespace.HelloWorldModule, AssemblyNam,前者是命名空间.类名,后者是该类所在项目工程中AssemblyInfo.cs文件中所定义的AssemblyTitle属性值。
-----------------------------------------------------------------------------------
深入HttpModuleHttpHandler
一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在 hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给 HttpModule
上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括 BeginRequest, EndRequest,AuthentiacteRequest 等等。
IHttpHandler
它是asp.net Framework提供的一个接口,定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定。也就是说,如果你想要自行处理某些类型的 HTTP请求信息流的话,你需要实现这些系统约定才能做到。譬如一个*.aspx文件,用来处理此类型的Http请求,ASP.NET FRAMEWORK将会交给一个名为System.Web.UI.PageHandlerFactory的HttpHandler类来处理。
HH 和HM一样,系统会在最初始由ASP.NET FRAMEWORK首先加载machine.config中的HttpHandler,而后会加载Web应用程序所在目录的web.config中的用户自定义的HttpHandler类。但是系统与我们自定义的HH之间的关系是"覆盖"的,也就是说如果我们自定义了一个针对"*.aspx"的 HttpHandler类的话,那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理,而我们自己的 HttpHandler类则需要自己完全解析这个Http请求,并作出处理。
IHttpHandler接口中最重要的方法 ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到 HttpHandler容器中的时候,framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。
framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的,而是定位到了其 内部默认的IHttpHandler Factory上了。IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的,这样做的优点是大大增强了系统的负荷性,提升了效率。
分享到:
评论

相关推荐

    ASP.NET学习积累的代码吐血奉献

    Web Forms是最早的ASP.NET模型,使用控件驱动的方式,类似于传统的Windows编程。MVC(Model-View-Controller)模型则更加灵活,强调分离关注点,适合构建复杂的应用程序。Web API则专注于构建RESTful服务,方便与...

    ASP.NET教程

    Web Forms是最早的ASP.NET模型,提供了一种事件驱动的编程模型,适合快速开发传统的Web应用。MVC模式则更注重分层设计,使代码更易于测试和维护。Web API则专为构建RESTful服务而设计,用于创建数据接口供其他应用...

    ASP.NET 编程模型介绍

    ASP.NET框架的编程模型:是指在ASP.NET框架响应客户端请求的整个过程中,按固定顺序执行的一系列处理步骤和事件

    ASP.NET第一步(基于C#和ASP.NET 2.0).rar

    1. **控件模型**:ASP.NET 2.0提供了丰富的服务器控件,如Button、Label、TextBox等,这些控件极大地简化了用户界面的开发。控件还支持数据绑定,可以直接与数据库交互,展示和编辑数据。 2. **母版页(Master Pages...

    ASP.NET 完全入门

    ASP.NET与Windows 2000 Server/Advanced Server的完美组合,为中小型乃至企业级的web商业模型提供了一个更为稳定,高效,安全的运行环境。 正是基于上面的激动人心的理由,我们编写了这样一本书

    基于ASP.NET的图书销售系统

    1. **ASP.NET架构**:ASP.NET基于.NET Framework,它提供了多种编程模型,如Web Forms、ASP.NET MVC、ASP.NET Web Pages和ASP.NET Core。在这个图书销售系统中,很可能是采用了Web Forms模型,该模型提供了一种与...

    ASP.NET资料ASP.NET资料

    ASP.NET是微软公司推出的一种基于.NET Framework的服务器端编程模型,用于构建动态网站、Web应用程序和Web服务。这个压缩包中的“ASP.NET资料”很可能包含了关于ASP.NET的各种学习资源,如教程、示例代码、文档等,...

    asp.net 后台管理系统界面

    ASP.NET MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个主要部分:模型、视图和控制器。模型处理业务逻辑和数据,视图负责显示数据,而控制器处理用户输入并协调模型和视图之间的交互。MVC ...

    ASP.NET Web Application

    Web Forms是最早的ASP.NET模型,通过控件和事件驱动的方式构建页面;MVC(Model-View-Controller)模型则提供了分离关注点的开发方式,更便于测试和维护;Web Pages则强调简单、轻量级的页面开发;SignalR则用于实时...

    ASP.NET文件参考 asp.net asp.net技巧

    ASP.NET是微软公司开发的一种用于构建动态网站、Web应用程序和Web服务的技术,它基于.NET Framework,为开发者提供了强大而高效的应用程序开发环境。本文件参考将深入探讨ASP.NET的核心概念、关键特性和实用技巧。 ...

    使用ASP.NET技术开发网上书店(ASP.NET)

    ASP.NET不仅仅是一个编程语言,而是一个包括服务器控件、事件驱动模型、自动状态管理等在内的完整开发环境。它支持多种编程语言,如C#、VB.NET,提供丰富的开发工具如Visual Studio,让开发者能够快速构建网页应用...

    ASP.NET学习大总结+笔记

    ASP.NET是服务器端的编程模型,它允许开发人员使用多种编程语言(如C#、VB.NET)创建动态网页和Web服务。ASP.NET的核心组件包括页面生命周期管理、状态管理、安全性、部署等,这些都为构建复杂的企业级Web应用提供了...

    ASP.NET 完全入门书籍

    2. **Web Forms**: 这是ASP.NET中最常见的开发模型,它允许开发者使用控件和事件驱动的编程模型来创建交互式的网页。Web Forms中的每个页面都有一个生命周期,包括初始化、加载、回发处理、呈现和卸载等阶段。 3. *...

    ASP.NET系统结构模型功能结构图

    它的系统结构模型是理解ASP.NET工作原理的关键,而功能结构图则是这种模型的可视化表示,帮助开发者理解和设计应用的各个组件和它们之间的关系。以下是关于ASP.NET系统结构模型和功能结构图的详细解释: 1. **ASP...

    ASP.NET教程 ASP.NET教程

    ASP.NET 是微软公司推出的一种基于.NET Framework的服务器端编程模型,用于构建动态网站、Web应用程序和Web服务。这个教程将带你深入理解ASP.NET的核心概念和技术,帮助你掌握开发高效、可扩展的Web应用的技能。 在...

    ASP.NET完全入门

    Web Forms是最早的ASP.NET模型,提供了一种事件驱动的编程模型,类似于Windows Forms。MVC(Model-View-Controller)模式则强调分层架构,便于测试和维护。ASP.NET Core是跨平台的轻量级框架,它结合了Web Forms和...

    Asp.Net MVC案例教程

    Asp.Net MVC是一种基于模型-视图-控制器(Model-View-Controller)设计模式的Web应用程序开发框架。它由微软公司推出,旨在提供更灵活、可维护和测试友好的方式来构建动态网站、Web应用程序和服务。本教程将通过一...

    ASP.NET实例代码

    8. **Web Forms和ASP.NET Core**:ASP.NET Web Forms是传统的ASP.NET模型,而ASP.NET Core是微软推出的新一代跨平台框架,提供更高的性能和更现代化的开发体验。 在“asp.ne200”这个压缩包中,很可能是包含了一些...

    asp.net网站模板

    在学习这个模板时,初学者可以深入了解ASP.NET的页面生命周期、控件模型、数据绑定以及如何使用C#或VB.NET编写服务器端代码。此外,还可以学习如何使用ASP.NET的身份验证和授权服务,以及如何通过AJAX技术实现页面的...

Global site tag (gtag.js) - Google Analytics