本文标签:ASP.NET处理
我们分3个部分来讨论ASP.NET处理过程 。这里我们主要讨论WebApplication以上的两个部分 。中间会对比IIS在Asp.net中的角色 。
了解这些过程之后,我们就可以定义自己的WebServer 。WebServer不是只有IIS的,没了它,asp程序照样过日子 。
这里使用的例子是WebMatrix的WebHost的实现 。通过修改这些类,来实现我自己的一个小功能:Host为每个WebApp分配一个ServiceManager的实例 。(没有版权问题吧?)
第一部分:WebHost
从端口侦听请求,接受请求,形成HttpWorkerRequest
1:创建socket端口接听 listener而已 。
2:创建WebHost 通过.net提供的ApplicationHost.CreateApplicationHost(typeof(Host), virtualPath, physicalPath)静态函数来创建Asp.net处理的宿主空间 。 这个Host继承自MarshalByRefObject,可以跨程序域调用 。这是关键,因为每个WebApp会被分配一个AppDomain,进行运行 。所以Host要可以创建这些AppDomain,并且可以调用 。
3:实现抽象类HttpWorkerRequest .net提供了一个SimpleWorkerRequest的实现 。简单的可以直接调用它 。复杂一点的话,需要自己重写更多的方法 。 这个类就是封装了所有向下传递的属性和数据 。 这时WebHost和具体的每个WebApp的唯一连接点 。
第二部分:处理HttpWorkerRequest
根据HttpWorkerRequest,实例化出HttpContext和IHttpHandler 。这部分好像就进了.net内部的几个类了 。不知道能不能在控制 。
1:HttpRuntime的第一次处理 根据HttpWorkerRequest 创建context,根据contxt创建IHttpHandler实例,hanlder根据这个context开始运行 。然后就到了网页处理了 。
通过调用System.Web.HttpRuntime.ProcessRequest(HttpWorkerRequest wr)静态函数来进入这个处理 。
System.Web.HttpRuntime接受到HttpWorkerRequest对象 。看看这个函数: - publicstaticvoidProcessRequest(HttpWorkerRequestwr)
- {
- //忽略其他细节
- HttpContextcontext1=newHttpContext(wr,false);
//根据HttpWorkerRequest创建context IHttpHandlerhandler1=HttpApplicationFactory.GetApplicationInstance(context1); //根据context创建App实例 handler1.ProcessRequest(context1);//运行实例,参数是context 。 }
2:HttpContext(HttpWorkerRequest, false) 创建HttpContext,根据HttpWorkerRequest 。 只看这两句就行 。 request=new HttpRequest(wr, this); response=new HttpResponse(wr, this);
request和response都是依据wr构造的 。
3:再看看HttpRequest是如何构造的 这是原代码 - internalHttpRequest(HttpWorkerRequestwr,HttpContextcontext)
- {
- this._contentLength=-1;
- this._wr=wr;
- this._context=context;
- }
第三部分:网页处理 。
既然已经产生了IHttpHandler和HttpContext了,剩下的就到了具体的每个WebApp了 。
IHttpHandler之后就到了每个页面了 。成了WebApplition 。具体的不说了 。 这时候的handler就已经获得了HttpContext了 。
其中IIS作的,好像就是第一部分的功能,我们自己做一个宿主的话,也主要是完成第一部分 。
看看WebMatrix的这几个类的定义
1:WebMatrix.Server 这个类是用来向外提供操作接口的类 。继承自MarshalByRefObject 。可以跨域调用 。 主要操作:CreateHost(根据端口号,虚拟目录,物理根目录等信息创建WebHost),StopWebServer(停止服务),StartWebServer(启动服务)等 关键代码:host=ApplicationHost.CreateApplicationHost(typeof(Host), this._virtualPath, this._physicalPath);者是用来创建Host的代码 。
2:WebMatrix.Host 这是为每个WebApp创建处理进程空间的宿主类 。继承自MarshalByRefObject 主要操作: OnSocketAccept{new connection;connection.ProcessOneRequest(host,this);} 在接受到socket之后,调用处理请求
3:WebMatrix.Connection 连接处理 主要部分:调用Request - rocessOneRequest()
- {
- Requestrequest1=newRequest(this._host,this,this._serviceManager);
- request1.Process();
- }
4:WebMatrix.Request 重点 。继承自SimpleWorkerRequest 。SimpleWorkerRequest继承自HttpWorkerRequest 。而HttpWorkerRequest就是宿主和WebApp唯一的连接点,是WebApp唯一的入口参数 。 这个类主要重写Process方法,通过调用HttpRuntime.ProcessRequest(this)这句代码来进行WebApp的处理 。
好了,现在来完成我自己的一个小功能 1:先获取Matrix的WebServer的源代码 。通过Reflector工具 。 2:修改Request类,就是那个继承自SimpleWorkerRequest的那个类,加一个属性:ServiceManager 3:修改Host和Server,使之可以向Request传递ServiceManager 。 4:使用:在每个WebApp里可以这样使用 IServiceProvider p=(IServiceProvider)HttpContext.Current; Request wr=(Request)p.GetService(typeof(HttpWorkerRequest)); object o=wr.ServiceManager; 比如这是在一个网页的page_load里面 。
注意事项 1:物理根目录 就像wwwroot一样,使整个site的根目录 。比如c:\maxsoft.site
2:虚拟目录 相对于根目录之后的位置 。比如c:\maxsoft.site\myTest的虚拟目录就是/myTest
3:端口号 随意制定,只要不和系统的冲突就可以 。比如6066
4:访问方式 目标机器:端口号/虚拟目录/文件名 。比如http://maxpc2/myTest/webform1.aspx
5:安装 一定要在物理根目录的bin文件夹里面放有本WebServer程序 。比如要把“Maxplatform.UI.Web.WebHost.dll”拷贝到c:\maxsoft.site\bin\目录下 。这个文件是编译有WebHost类的那个程序集 。以上介绍ASP.NET处理过程 。
|