前一天学习了http协议,简单的socket编程,昨日就开始进入正式的asp.net学习,第一阶段入门的学习大致上分成了5个阶段,分别如下:
- 一般处理程序,html控件,与.net内部对象,目标:知道ASP.NET的运行机制原理,对几个asp.net核心对象有个初步的了解
- webform aspx:控件树,页码生成等
- ajax:理解ajax实现机制
- webform服务器控件:没啥好说的
- asp.net高阶内容:缓存/母板页/错误页/静态页/网站部署/页面生命周期/httpmoudle/url重写等
昨天开始进入入门阶段第1阶段的学习,由于前天自己做了个web服务器(上篇博客中模拟了浏览器与服务器之间的交流),已经了解了整个初步的流程,所以学习一般处理程序就不是什么问题.下面看一个小小的DEMO:首先创建一个登陆的html页面和一个一般处理程序:
<form action="Login.ashx" method="GET">
<input type="text" name="UserName " value=""/>
<input type="text" name="PassWord" value="" />
<input type="submit" name="submit" value="submit" />
</form>
当我们输入用户名跟密码,提交给一般处理程序帮我们处理:
public void ProcessRequest(HttpContext context)
{
//指定输出格式
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
context.Response.Write(context.Request.QueryString["name"]+"欢迎您....");
}
当然一般程序处理需要大量输出html时还是非常不方便,需要拼接html代码,用起来不方便,这里我就不演示了,当然处理文件,图片还是非常好用,以至于出现了webform,完全可以把前台页面看成一个模板(用过codesmith的人都知道模板,里面有<% %>可以写C#代码),前台页面继承后台,所以后台页面类的一些东西可以加到前台去,后台处理完,前台就跟着变,这样就不需要输入大量的html代码,我暂且把webform的前台页面看成一个模板.ok不说webform.
当我们输入登录名跟密码后提交按钮,浏览器帮我们做了什么,服务器又是怎么接收到这些数据的?我们看似非常的简单,浏览器帮请求封装成http请求,然后通过socket发送到服务器,服务交给一般处理程序处理,其实其中经过大量了处理,下面我们来看看详细的处理过程.
Client-----HTTP.SYS--IIS-----W3SVC服务-----INetInfo.exe---asp.net_Isapi----W3WP.EXE----ISAPIRuntime------httpRuntime-----httpapplication
当客户端发送请求通过socket到达web服务器,首先到达一个内核模块Http.SYS,它的职责主要解析当前请求的协议以及端口,另外就是分发当前请求给处理http请求程序,然后到达我们熟悉的IIS服务器,W3SVC服务的INETINFO.EXE会分析进程里面的元数据,如果是静态页面等就直接处理,如果是ashx,aspx等就会交给asp.net_isapi,这是个com程序c++写的负责net运行时启动,并负责将http请求交给asp.net运行时...这个dll是非常重要,可以算是桥梁.然后到达isapiRuntime,会调用processReuquest方法,下面简称pr方法,通过ecb一个句柄获取到IIS的请求报文,然后创建一个httpworkrequest对象,里面封装了我们发送给的请求---再然后到httpruntime,它也有pr的方法,把httpworkrequest再封装撑httpcontext,其中就包含httprequest跟httpresponse,httpapplication是通过工厂反射出来的,其中有个httpapplication应用池,然后httpapplication有23个事件,其中19个公开的,,在第8个事件创建我们的handerl实例,在11跟12事件之间调用handerl实例的pr方法.这样一个一般处理程序差不多就结束了,事件结束后,就按原路返回给客户端.我感觉如果我们要看里面的源码等httpruntime 是个入口.我们可以用反编译工具看看里面到底是怎么写的.
说了这么多,我们能学到什么呢,知道这些又有什么用呢,我想不懂得asp.net运行机制的,出了问题你都不知道在哪边,关键我们还能学到思想,在那请求管道23个事件中我们可以进行扩展,通过httpmodule等,本身httpapplication自己就注册了这些事件,可以把httpmodule看成过滤器,这种插件机制我们可以学学,如果有能力可以用到我们以后的项目当中去.下面是一张图里面是大概的流程,此图还不是很详细,推荐大家去看个博客写的挺不错的 http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp有些资料也是从这里面学习到的,由于刚刚接触asp.net很多地方写的不好,可能有错误,请大家指出错误~