三个方面详细讨论ASP.NET处理
创始人
2024-04-19 22:00:40
0

我们分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对象。看看这个函数:

  1. publicstaticvoidProcessRequest(HttpWorkerRequestwr)  
  2. {  
  3. //忽略其他细节  
  4. HttpContextcontext1=newHttpContext(wr,false);  
  5. //根据HttpWorkerRequest创建context  
  6. IHttpHandlerhandler1=HttpApplicationFactory.GetApplicationInstance(context1);  
  7. //根据context创建App实例  
  8. 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是如何构造的
这是原代码

  1. internalHttpRequest(HttpWorkerRequestwr,HttpContextcontext)  
  2. {  
  3. this._contentLength=-1;  
  4. this._wr=wr;  
  5. 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

  1. rocessOneRequest()  
  2. {  
  3. Requestrequest1=newRequest(this._host,this,this._serviceManager);  
  4. 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处理过程。

【编辑推荐】

  1. ASP.NET页面显示XML数据
  2. 了解什么是IFRAME ASP.NET
  3. ASP.NET生命周期的展示
  4. 解决ASP.NET AJAX脚本的错误问题
  5. 详解ASP.NET应用程序

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...