当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

Asp.net的处理机制和自定义WebServer

我们分3个部分来讨论.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对象。看看这个函数:
public static void ProcessRequest(HttpWorkerRequest wr)

{
    //忽略其他细节

    HttpContext context1 = new HttpContext(wr, false);//根据HttpWorkerRequest创建context。可以看出HttpWorkerRequest是contxt的基础。

  IHttpHandler handler1 = 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是如何构造的
这是原代码
internal HttpRequest(HttpWorkerRequest wr, HttpContext context)
{
      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()
    {
        Request request1 = new Request(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的那个类,

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接