`
java-mans
  • 浏览: 11386562 次
文章分类
社区版块
存档分类
最新评论

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.NET01页面对象模型

    ASP.NET01页面对象模型 ASP.NET01页面对象模型 ASP.NET01页面对象模型 ASP.NET01页面对象模型

    ASP.NET 编程模型介绍

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

    ASP.NET 完全入门

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

    ASP.NET数据库网站设计教程(C#版)[孙士保][电子教案]

    ASP.NET数据库网站设计教程(C#版)[孙士保][电子教案] 第1章 ASP.NET基础 本章内容:C/S和B/S架构...本章内容:ASP.NET Web窗体模型,ASP.NET网站的组成文件,Page对象。 本章重点:ASP.NET Web窗体模型,Page对象。

    ASP.NET的网页代码模型及生命周期

    第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的...

    ASP.NET AJAX入门系列教程

     ASP.NET 在2007年初推出了其第一个正式版本,并将Atlas更名为ASP.NET AJAX,对应服务器端和客户端分别对应有ASP.NET服务器端编程模型和ASP.NET客户端编程模型,前者包含ASP.NET 2.0 AJAX Extensions和,后者包含...

    ASP.NET Core MVC从入门到精通系列文章PDF版

    本系列文章共计20篇,主要包括ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,...

    ASP.NET MVC 5入门指南(中文PDF+源码)

    ASP.NET MVC 5 - 添加一个模型 6. ASP.NET MVC 5 - 创建连接字符串并使用SQL Server LocalDB 7. ASP.NET MVC 5 - 从控制器访问数据模型 8. ASP.NET MVC 5 - 验证编辑方法和编辑视图 9. ASP.NET MVC 5 - 给电影表和...

    asp.net3.5 教程4

    第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的...

    [ASP.NET.AJAX编程参考手册(涵盖ASP.NET.3.5及2.0)].(美)霍斯拉维.扫描版.pdf

    中文名: ASP.NET AJAX编程参考手册(涵盖ASP.NET 3.5及2.0) 原名: ASP.NET AJAX Programmer's Reference 作者: (美)霍斯拉维 译者: 刘志忠 图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 清华大学出版社 书号...

    【免费】ASP.NET MVC5 高级编程[附源码].rar

    ASP.NET MVC5高级编程(第5版.NET开发经典名著)作为Microsoft备受欢迎的MVC技术的最新版本,MVC 5是一个成熟的Web应用程序框架,支持快速的、TDD友好的开发。MVC允许开发人员创建动态的、数据驱动的网站。这样的...

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

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

    ASP.NET MVC概述

    ASP.NET MVC 框架提供用于创建 Web 应用程序的 ASP.NET Web 窗体模式的替代模式。ASP.NET MVC 框架是一个 可测试性非常高的轻型演示框架,(与基于 Web 窗体的应用程序一样)它集成了现有的 ASP.NET 功能,如 母版页...

    ASP.NET常见问题集锦.zip

    ASP.NET 页面对象模型.doc asp.net200问-专家门诊—ASP.NET开发答疑 ASP.NetWebPage深入探讨.txt ASP.NET中为DataGrid添加合计字段.doc ASP.NET中实现DataGrid数据排序.doc asp.net中的弹出对话框.doc ASP...

    ASP.NET从入门到精通

    第4章 ASP.NET 的网页代码模型及生命周期 第二篇 ASP.NET窗体控件 第5章 Web 窗体的基本控件 第6章 Web 窗体的高级控件 第三篇 数据操作篇 第7章 数据库与 ADO.NET 基础 第8章 Web 窗体的数据控件 第9章 ASP.NET ...

    ASP.NET 页面对象模型

    本文讨论关于建立ASP.NET Web页的事件模型和转化为HTML的各个过程的细节。ASP.NET HTTP 运行时管理着把请求URL转换成一个页面类的具体实例的对象管道,接下来把这些实例转换成一般的HTML文本格式。本文对代表各个...

    Asp.net 2.0高级编程(pdf)

    43 3.2.1内置编码 44 3.2.2新的后台编码模型 46 3.3ASP.NET2.0的Page指令 48 3.3.1@Page 49 3.3.2@Master 51 3.3.3@Control 52 3.3.4@Import 53 3.3.5@Implements 54 3.3.6@Register 55...

    ASP.net从入门到实践

    .NET Framework是一个支持构建、部署和运行下一代应用程序和Web服务...ASP.NET是.NET Framework的一部分。它是一个统一的Web开发模型,包括创建企业级Web应用程序的所必需的各种服务。本章将讲解ASP.NET 3.5的入门知识

    asp.net完全入门

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

Global site tag (gtag.js) - Google Analytics