asp.net内置对象 web开发如何调出客户端对象与事件

开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件&设属性&绑事件,便可以行走于天下。但这样真的就可以走一辈子吗?实际上,ASP.Net经常被喷的诟病就在于WebForm以及只会拖控件的ASP.Net程序员,往往大型互联网系统也没有采用WebForm的模式进行开发。但是,WebForm并不是一无是处,而是我们没有用好,还有很多东西我们知其然不知其所以然,现在我们就来对这些平时所不注意但又十分关键的东西一探究竟。
一、神秘不神秘&aspx探秘
1.1 WebForm时代的请求对象
  在WebForm中,所有的页面请求都是以aspx文件作为请求对象(静态化和伪静态的除外)。例如上图中,访问者在浏览器端通过输入URL:blog/index.aspx向服务器端发送请求,服务器端首先找到这个index.aspx,然后创建页面对象(index.aspx.cs文件中的类对象),调用这个页面对象中的ProcessRequest方法和Page_Load方法(在此过程中,有可能需要访问数据库)来生成aspx页面的所有html内容,最后将生成好的html返回给浏览器端。
  因此,我们可以知道,服务器端对aspx的处理过程其实就是一个渲染生成html的过程。
1.2&神奇的&%%&
  通过实践可知,在aspx中除了&%%&的内容和runat="server"的内容,其他都是原样输出。这是因为我们在aspx中可以借助&%%&写入C#代码,就跟ASP、PHP一样的风格。但是,在实际开发中并不建议这么来做,因为它违反了CodeBehind的原则,不利于职责的分离。
  ①直接写入C#业务逻辑代码
for (int i = 0; i & 5; i++)
Response.Write("I am a webform page.&br/&");
  ②获取C#方法的返回值
  假设页面后端代码中有一个GetServerTime的方法,它只有一句代码:return DateTime.Now.ToString();。页面中只需要通过&%= 方法名() %&即可获取该方法的返回值。
&%= GetServerTime() %&
  ③aspx中能够访问的方法的访问修饰符只能为public和protected:这是因为aspx和aspx.cs之间的关系是编译生成后aspx和aspx.cs会创建两个类,并且aspx继承自aspx.cs中的类,在面向对象中子类要访问父类的方法,那么方法的访问修饰符必须为public或protected。(后面会讲到aspx和aspx.cs的关系,不要急)
1.3 aspx与ashx的关系
  ashx是一般处理程序,它是一个实现了IHttpHandler的轻量级处理程序,处理操作都在ProcessRequest方法中完成。
  而aspx则相当于一个特殊的、高级的ashx,aspx所对应的父类是System.Web.UI.Page这个类,通过查看Page类的定义,我们可以看到Page也实现了IHttpHandler的这个接口。另外之所以说它是高级的ashx,是因为aspx帮我们封装了许多底层的操作,使得我们可以进行傻瓜式的开发操作。
  看到这里,我们不禁要问:既然有了ashx为何还要aspx?大家都知道ashx中的ProcessRequest方法需要向请求响应报文中输出html,而每个html页内容有很多,如果每次响应都往里边输出html开发起来会很痛苦(这里主要是指在如果不借助模板引擎的情况下),而aspx则起到了类似于于一个模板引擎的作用,帮我们把html的大体框架定义好了,我们在开发中就只需要操作每次响应需要更改的内容即可。
1.4&aspx与aspx.cs的关系
  (0)假如我们有以下的名为FirstPage的一个aspx页面:
&html xmlns="http://www.w3.org/1999/xhtml"&
&head runat="server"&
&title&第一个WebForm页&/title&
&form id="form1" runat="server"&
哈哈,我是ASP.Net WebForm,下面看我的表演。
for (int i = 0; i & 5; i++)
Response.Write("I am a webform page.&br/&");
&%= GetServerTime() %&
&asp:TextBox ID="txtDateTime" runat="server"&&/asp:TextBox&
&asp:Button ID="btnGetTime"
runat="server" Text="获取时间" onclick="btnGetTime_Click" /&
&% GetDllInfo(); %&
  其后台代码.cs文件代码如下:
namespace WebFormDemo
public partial class FirstPage : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
protected string GetServerTime()
string result = "服务器时间:" + DateTime.Now.ToString();
protected void GetDllInfo()
Response.Write("页面类名称:"+this.GetType() + "&br/&");
Response.Write("程序集地址:"+this.GetType().Assembly.Location + "&br/&");
Response.Write("父类的名称:"+this.GetType().BaseType + "&br/&");
Response.Write("程序集地址:"+this.GetType().BaseType.Assembly.Location + "&br/&");
protected void btnGetTime_Click(object sender, EventArgs e)
txtDateTime.Text = DateTime.Now.ToString();
  (1)CodeBehind:在每个aspx文件中的头部,我们都会看到以下的一句代码
&%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FirstPage.aspx.cs" Inherits="WebFormDemo.FirstPage" %&
  其中CodeBehind这个属性定义了此aspx页面的专属后台代码文件的名称,而Inherits这个属性则定义了此aspx页面所要继承的父类的名称(这也可以简单地说明,aspx页面会单独生成一个类,与后台代码类不重合在一起)。因此,aspx.cs就是aspx的后置处理代码,负责处理aspx中&%%&和runat="server"的内容。
  (2)子类与父类:我们使用ASP.NET写的网站在运行时候都会被编译生成为一个一个的程序集(.dll),而我们的aspx页面也会被生成为一个一个的类。那么,我们如何来证明aspx会生成一个类,而且还是aspx.cs中的类的子类呢?那么,我们需要反编译系统所生成的程序集(.dll)文件。
  第一步:找到网站所生成的程序集
  我们可以通过写入以下代码,然后在aspx中&% GetDllInfo(); %&调用;
protected void GetDllInfo()
Response.Write("页面类名称:"+this.GetType() + "&br/&");
Response.Write("程序集地址:"+this.GetType().Assembly.Location + "&br/&");
Response.Write("父类的名称:"+this.GetType().BaseType + "&br/&");
Response.Write("程序集地址:"+this.GetType().BaseType.Assembly.Location + "&br/&");
  浏览页面,会显示以下结果:通过下图可以看到,我们的FirstPage这个页面会生成一个ASP.firstpage_asx的类,其父类是FirstPage。
PS:当某个页面第一次被访问的时候,CLR就会使用一个代码生成器去解析aspx文件并生成源代码并编译,然后以后的访问就直接调用编译后的dll,这也是为什么aspx第一次访问的时候非常慢的原因。 &
  第二步:反编译临时程序集文件
  ①通过上面显示的路径找到dll,并拖到反编译工具(ILSpy或者Reflector,前者开源免费,后者已经收费,但天朝,你懂的。)进行查看。通过下图可以看出,页面类aspx是后台代码类所绑定的子类,它的名称是aspx文件名加上&_aspx&后缀。因此,这里也就解释了为什么在aspx中要访问的方法必须是public和protected的访问修饰符才可以。
  ②下图则展示了对页面后置代码类所在的程序集进行反编译的情况:
  第三步:我们在刚刚时就说了,服务器端对aspx处理的过程是一个渲染生成html的过程,如何来深入理解这句话,我们可以在此借助反编译工具来一探究竟。通过对aspx类的反编译,我们可以看到在它的方法列表中有如下几个命名格式一样的方法:
  ①_BuildControl_controlX(); X代表数字
  通过对这几个方法的源码分析,我们可以知道,这些方法都在做一件事件:拼接生成aspx页面的html内容。每个方法都会返回一个控件类型的对象,有LiteralControl类型,也有HtmlHead类型(在aspx中只要给head加了runat="server"就会有此类型的生成方法)等等,那么这些数字又代表了什么?难道是生成html的执行顺序么?这些生成方法又是在哪个方法中被一一调用的呢?别急,下面我们就来看看。
  ②通过后面几个方法源码的查看,我们发现原来上面的几个生成控件的方法都在一个叫做BuildControlTree的方法(生成控件树)中被依次调用。
  这里几乎是按照数字序号的顺序来依次调用具体的BuildControl_controlX()方法,并将每次返回的控件添加到页面中去。这里可以看到,BuildControlTree方法的参数是其本身,它实现了IParserAccessor的接口。这里暂且将这个接口其理解为一个大的控件容器,可以往这个容器里边添加子控件(这里看到不同类型的控件都可以往里边加,那么肯定初步断定方法参数应该是object类型),这里将每次调用BuildControl_controlX()方法所返回的控件类型添加到了这个容器中。
  ③刚刚分析了BuildControlTree方法,知道了控件的生成过程。但是,页面主体内容又在哪里呢?服务器端要返回的内容可不止是那些控件的HTML代码啊。别急,通过查看反编译的方法,我们看到原来Renderform1这个方法里边。PS:这里方法名为什么是form1呢?那是因为我们在aspx中给form表单设置的ID就为form1。
  ④这里我们就分析到这儿,而WebForm具体的页面生命周期留到后面的ASP.Net页面生命周期探索的文章中详细介绍。这里我们只需要知道,aspx这个类是其后置代码类的子类,它要做的工作就是帮我们生成要返回浏览器端的html内容即可。其中,RenderForm将渲染生成整个form表单,而BuildControlTree则会生成服务器控件树,以便在后面的方法中方便地调用每个控件的RenderControl方法生成html字符串。
二、好用不好用&服务器控件探秘
2.1 企业中到底在用哪些控件?
  企业项目中经常使用到的最多还是一些&轻量级&的控件,例如:Button、TextBox、CheckBox、RadioButton、DropDownList、Repeater、ListView等;就我所实习的单位来说,这一年做WebForm的项目以来,用的最多也就是这些控件,数据控件除了Repeater就没用过其他的。我觉得数据控件的话,好好学习下Repeater就够了,因为Repeater已经足够强大了。至于什么***DataSource、Validator、Wizard、Login还有什么ASP.Net AJAX ToolKit就根本没杂用,这些控件既复杂又不实用,而且还比较重量级。
PS:有关Repeater控件的详细学习,可以参考w3school的教程:
2.2 需要注意的基本控件用法
  (1)Button控件中的OnClientClick属性
  ①在WebForm中,Button控件有两个Click事件:一个是OnClick的服务端事件,另一个是OnClientClick的客户端事件;OnClick事件写在后置代码类中,每次点击Button首先会触发OnClientClick事件(OnClientClick会返回一个bool值,为true则继续执行OnClick,为false则不继续)。
  ②通过分析这个属性,可以知道OnClientClick是一个字符串属性,写的代码是JavaScript代码,在上面所说的BuildControl方法中会渲染成input的onclick方法,它会运行在浏览器端。
1 &%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ClientClickPage.aspx.cs"
Inherits="WebFormDemo.ClientClickPage" %&
4 &!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&
5 &html xmlns="http://www.w3.org/1999/xhtml"&
6 &head runat="server"&
&title&OnClientClick&/title&
&script type="text/javascript"&
function checkConfirm() {
var flag = confirm("您确定要删除此内容?");
14 &/head&
&form id="form1" runat="server"&
&asp:Label ID="lblFlag" runat="server" Text="This is a label control text."&&/asp:Label&
&asp:Button ID="btnDelete" runat="server" Text="Delete"
OnClientClick="return checkConfirm()" onclick="btnDelete_Click" /&
23 &/body&
24 &/html&
  在上面的Button控件中,既设置了OnClientClick也设置了OnClick服务端事件,浏览生成的页面源代码,可以看到在生成的html中,OnClientClick确实是渲染成了input的onclick这个浏览器端的事件:在Button每次以POST方式向服务器提交请求之前,都会先进行checkConfrim这个方法的判断,如果返回值为true才会将请求提交到服务器端;
  (2)被某些人滥用的LinkButton
  ①LinkButton用法跟Button差不多,区别就只在于LinkButton渲染成超链接(&a&&/a&),而Button渲染生成input标签(&input type="button"&&/input&)。
  ②不要用LinkButton来实现普通的超链接,在实际开发中,我还真见过有些人用LinkButton来实现超链接的:他们在LinkButton的OnClick事件中写Response.Redirect("xxx.aspx");这种页面跳转代码,完全是作死的节奏啊。能在浏览器端进行的事儿为啥要弄到服务器端来进行呢?而且就只是一个页面跳转的小事。
2.3 AutoPostBack的那点事
  (1)什么是PostBack
  比如现在正在访问a.aspx这个页面上,点击页面上的某个submit按钮把数据提交到a.asx.cs进行处理,这个过程则可以看作是:&从客户端浏览器把之前的状态数据提交回来(PostBack)&。
PS:设置了runat="server"的Button或者input控件都会渲染生成type="submit"的按钮
  (2)刚刚提到只有点击submit类型的按钮才会提交请求到服务器,那么在以下这种场景如何破呢?
1 &form id="form1" runat="server"&
&asp:DropDownList ID="ddlProvince" runat="server"
onselectedindexchanged="ddlProvince_SelectedIndexChanged"&
&asp:ListItem Value="BJ"&北京市&/asp:ListItem&
&asp:ListItem Value="CQ"&重庆市&/asp:ListItem&
&asp:ListItem Value="SC"&四川省&/asp:ListItem&
&/asp:DropDownList&
&asp:DropDownList ID="ddlCity" runat="server"&
&asp:ListItem Value="-1"&请先选择省份&/asp:ListItem&
&/asp:DropDownList&
13 &/form&
  有一个省市两级联动的下拉列表场景,在用户选择一个省份后,自动从服务器获取属于该省份的市名下拉列表。这里使用了DropDownList控件,该控件提供了一个叫做SelectIndexChanged的事件,它会帮我们渲染生成select的onchange的浏览器事件。但是在页面的浏览过程中,我们怎么选择不同的省份,市名称的下拉列表就是不动,因为没有向服务器提交数据请求。
  ①这时候,一位名叫MSDN的大神会告诉你,需要给这个DropDownList控件设置一个AutoPostBack="true"的属性,经调试后果然可行了。但是,作为一个学习者,我们会想知道到底这个AutoPostBack帮我们做了什么事儿?这时,我们可以通过查看浏览器的源代码一探究竟。
  ②通过浏览器提供的开发人员工具查看数据请求报文,可以看到除了提交form中的input外,还提交了ASP.Net WebForm预置的一些隐藏字段,而这些隐藏字段则是WebForm为我们提供便利的基础。比如EventTarget则记录刚刚提交给服务器的是哪个服务器控件。
2.4 为什么需要IsPostBack
  注:WebForm页面中如果有一个runat="server"的form,那么必定会涉及到IsPostBack。
  (1)Http的无状态:因为Http是无状态的,所以这次会话结束下次再给我提交请求我也不记得你是谁,即使你是李刚的儿子,老子也不认识。那么,为了解决这种问题,我们可以使用一些方法来解决,例如设置一个隐藏字段来判断,如果是PostBack那么肯定请求报文中会带上这个字段,如果不是那么请求报文中肯定没有这个字段。比如,下面我们使用隐藏字段来作为判断PostBack的标志。
&input name="IsPostBack" type="hidden" value="true" /&
  (2)ASP.Net WebForm中内置了一个IsPostBack属性(bool类型),我们可以在Page_Load事件中判断IsPostBack是否为true,如果不为true则可以知道是第一次访问或者是请求页面的操作,而如果为true则代表是PostBack操作,我们可以分别进行不同的业务逻辑处理。例如:有的代码只会在页面第一次加载时才执行(比如从数据库中读取数据并显示),这时就应该使用IsPostBack进行判断。
if (!IsPostBack)
this.lblInfo.Text = "第一次来,不是PostBack";
this.lblInfo.Text = "非第一次来,是PostBack";
  (3)通过查看生成的页面html代码,我们没有发现页面中有IsPostBack的这个隐藏字段。那么,它是存储在哪个位置又是根据什么来判断的呢?实际上,IsPostBack属性是根据ViewState中的一些特殊的键值对来判断赋值的(因为:每次提交请求后,服务器端都会返回不同的ViewState隐藏域给浏览器端;同样,浏览器每次也会将ViewState提交给服务器端,服务器端会解析ViewState还原上次状态)。对于ViewState,可以通过一些软件例如ViewStateDecoder进行解析查看,例如下图:
  如果我们禁用了ViewState,那么也就无法正常使用IsPostBack属性了,也无法正常使用PostBack了。那么对于ViewState,我会在下一篇进行简单探秘,本篇就到此为止。
  如果你觉得本文对你有用,那就麻烦点个&推荐&吧,也能让我更有动力写下去,谢谢!
  (1)反编译利器ILSpy:
  (2)aspx揭秘的WebFormDemo:
  (3)服务器控件揭秘WebFormDemo:
阅读(...) 评论()ASP.NET基础(2)
WEB客户端编程(2)
更新:2007 年 11 月
可以像对 HTML 元素那样,以声明方式向 ASP.NET 网页上的控件添加客户端脚本。或者,如果事件或代码依赖仅在运行时可用的信息,可以通过编程方式向 ASP.NET Web 服务器控件添加客户端脚本事件。
可以在客户端脚本中通过 ID 引用控件。有关更多信息,请参见 。
向按钮添加客户端脚本 onclick 事件需要一个专门过程,本主题后面的内容会对此进行介绍。
对客户端脚本的支持取决于浏览器。例如,Internet Explorer、Mozilla 和移动设备浏览器可能会对客户端脚本提供不同类型的支持。
以声明方式向 ASP.NET 服务器控件添加客户端事件处理程序
在控件的标记中添加事件属性,例如,onmouseover 或 onkeyup。针对属性值添加要执行的客户端脚本。
始终都要在属性中的客户端脚本之后添加一个分号 (;)。这是必需的,这样就可以在 ASP.NET 生成控件的客户端脚本(例如,如果控件的 AutoPostBack 属性设置为 true)时首先运行此代码。
控件标记中任何不与控件属性 (property) 对应的属性 (attribute)/值对都会按原样传递给浏览器。
下面的代码示例演示一个包含客户端脚本的 ASP.NET 网页,当用户将鼠标移到按钮上方时,此脚本就会更改该按钮的文本颜色。
Untitled Page
<asp:button id="Button1" runat="server"
text="Button1"
onmouseover="MakeRed();"onmouseout="RestoreColor();" />
以编程方式向 ASP.NET 控件添加客户端事件处理程序
事件中调用控件的
下面的代码示例演示如何向
控件添加客户端脚本。该客户端脚本显示
控件中的文本长度。该脚本假定页面包含一个名为 spanCounter 的 span 元素。
protected void Page_Load(object sender, EventArgs e)
String displayControlName = "spanCounter";
TextBox1.Attributes.Add("onkeyup", displayControlName +
".innerText=this.value.");
向按钮控件添加客户端 Onclick 事件
在按钮控件(、 和
控件)中,将 OnClientClick 属性设置为要执行的客户端脚本。
下面的代码示例演示如何向
控件添加客户端脚本 Click 事件。
<asp:Button ID="Button1" Runat="server"
OnClick="Button1_Click"
OnClientClick="return confirm('Ready to submit.')"
Text="Test Client Click" />
客户端脚本可以在客户端计算机上执行潜在的恶意功能。对于写入某一页面的脚本一定要非常小心,特别是在为响应用户输入生成或更改该脚本的情况下。有关更多信息,请参见。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:76923次
排名:千里之外
原创:25篇
转载:16篇
(1)(1)(2)(17)(6)(1)(11)(1)(1)ASP.Net请求处理机制初步探索之旅(1):前奏 - 文章 - 伯乐在线
& ASP.Net请求处理机制初步探索之旅(1):前奏
开篇:ASP.Net是一项动态网页开发技术,在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词,而ASP.Net MVC的出现让这项技术更加唤发朝气。但是,不管是ASP.Net WebForm还是ASP.Net MVC在请求处理机制上大部分都是相同的,只是在请求处理管道上的处理事件做了不同的操作,因此,本文标题不区分ASP.Net WebForm和ASP.Net MVC,但在后续的介绍中会区分开来介绍。此外,本文以IIS经典模式为主,不讨论集成模式(IIS7后加入了集成模式,不用加载外部的aspnet_isapi.dll组件)。
一、当一个请求到来时
①客户端发送一个请求给服务器端
②一个HTTP请求对应一个HTTP报文
③HTTP.SYS组件捕获请求,对报文作最基本的处理
HTTP.SYS是一个位于Windows Server和Windows XP SP2中的操作系统核心组件(内核模式中),能够让任何应用程序通过它提供的接口,以HTTP协议进行信息通讯。
关于内核模式与用户模式:
在Windows Server操作系统中,一个进程既可以运行于内核模式,也可以运行于用户模式。如果一个进程运行于内核模式,那么这个进程就可以访问所有硬件和系统数据;如果一个进 程运行于用户模式,那么这个进程不能直接访问硬件,而且访问系统数据时也会受到限制。在Intel处理器架构中一共有0~3四个特权级,内核模式运行于0级之内,而用户模式运行于3级。通过在内核模式运行Http.SYS,侦听器可以直接访问TCP/IP协议栈,但是又能够位于www服务之外,这样就不会受到应用程序中代码缺陷的影响,也不会因为应用程序崩溃而出现问题。
④如果该请求有缓存内容则直接响应
HTTP.SYS组件的一个重要的作用就在于它有一个缓存区,会将近期处理的响应结果放入这个缓存区之中,如果再次请求这个内容,则会从缓存区中取得内容并进行响应,提高了响应速度。而且, 静态的内容现在被缓存于内核模式下,这使服务响应速度更快。
二、判断是否动态资源
①IIS首先判断请求的内容是否是静态资源?
IIS首先会判断请求的是否是静态资源,如果是则直接到文件系统中拿到请求的html/css/js/jpg/gif/png等资源直接响应请求。
②如果是动态资源则先查找是由哪个扩展来处理?
IIS本身不会处理动态资源请求,它会根据请求的资源类型到一个被称为“处理程序映射”中去查找应该由哪个扩展程序来处理这个请求。在IIS中,对于asp.net的请求一般是由aspnet_isapi.dll这个组件来进行.net运行时的加载和具体请求的处理。有了基于ISAPI的扩展扩展程序,IIS服务器就可以根据客户端请求的资源扩展名,来决定应由哪个ISAPI扩展程序来处理客户端请求,然后就可以将请求转发给合适的ISAPI扩展程序。
关于IIS服务器扩展:
由于IIS服务器在设计时引入了开放的ISAPI接口标准,具备极高的可扩展性。在核心组件不变的情况下可灵活支持不同类型不同版本的ASP.NET应用程序。
关于ISAPI:
ISAPI(服务器应用编程接口),它为开发人员提供了强大的可编程能力,只要按照标准接口开发不同类型的Web应用程序的ISAPI扩展程序,就能实现对IIS功能上的扩展,从而使IIS可以处理不同类型的客户端请求。IIS管理器提供了应用程序配置功能,可以对不同的客户端请求配置不同的ISAPI扩展程序。ISAPI扩展程序通常以DLL形式存在,可以被IIS加载并调用。
三、一个神奇的入口
①所谓Worker Process(工作者进程)
刚刚我们大体上介绍了IIS的处理步骤,但其实IIS对于动态资源的处理首先会通过一个工作进程去加载具体的处理组件dll。以IIS 6.0为例,如果IIS判断它自己无法处理asp.net的请求,会由W3WP.exe所维护的工作进程来加载aspnet_isapi.dll。
②.NET运行时的加载
如果Web应用程序是第一次加载,那么首先会由aspnet_isapi.dll加载.NET运行时(主要是调用服务器上的.Net Framework创建CLR运行时)。而一个IIS工作进程里有一个应用程序池,其中可以承载多个应用程序域AppDomain。
关于应用程序池:
应用程序池就是可以看成装载计算机分配给动态网站的内存的容器。如果内存是水,那么应用程序池就是鱼缸,动态网站就是鱼缸中的金鱼。多个动态网站可以存在于同一个应用程序池里,即鱼缸中可以放多条金鱼。当然,如果金鱼多了,鱼缸中的空间有限,金鱼之间就会争抢空间,不是很坚固的鱼缸可能就会破裂,所有金鱼都会受到影响。即是动态网站多了,内存不足,可能会造成内存级别的溢出漏洞,影响所有在那个应用程序池上的动态网站。
关于应用程序域:
使用.NET建立的可执行程序,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中。应用程序域是.NET引入的一个新概念,它比进程所占用的资源要少,可以被看作是一个轻量级的进程。
③应用程序域的加载
在.NET运行时创建好之后,通过应用程序域工厂AppDomainFactory创建应用程序域AppDomain。创建好AppDomain之后,就将请求转给该AppDomain中的ISAPIRuntime对象,然后调用ISAPIRuntime对象的ProcessRequest()方法来进行处理。
ISAPIRuntme.ProcessRequest()方法是进入ASP.Net的第一个入口,ASP.Net的核心处理部分就刚刚开始。此篇我将其称为前奏,是因为它是在ASP.Net的核心处理部分之前,将HTTP请求一步一步地传递给了ISAPIRuntime对象,后面我们再继续探索ASP.Net的请求处理机制,今天就到此结束!
四、前奏流程总览
(1)Darren Ji,《ASP.NET MVC请求处理管道声明周期的19个关键环节》:
(2)JackyXM,《HTTP.SYS详解》:
(3)木宛城主,《ASP.NET那点不为人知的事儿》:
(4)Tony He,《ASP.NET请求处理机制》:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2016 伯乐在线

我要回帖

更多关于 asp 缺少对象 的文章

 

随机推荐