CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

asp.net 处理过程 和 自定义 web server

楼主Dlwang2002(金银铜铁)2005-04-01 23:39:37 在 .NET技术 / ASP.NET 提问

我们分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的那个类,加一个属性: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类的那个程序集。  
   
   
  大家继续讨论  
   
   
  问题点数:0、回复次数:2Top

1 楼coldpanth(^War3^)回复于 2005-04-02 00:25:33 得分 0

...Top

2 楼HONGDUN()回复于 2005-04-02 00:57:10 得分 0

学习。Top

相关问题

  • 使用 <asp:DataList runat=server> DataList 控件和自定义 ItemTemplate 模板自定义数据信息中的一个小问题?
  • ASP自定义过程的问题
  • ☆★☆★☆——ASP支持自定义的函数吗?
  • asp中自定义函数可不可以调用自定义函数?高手来帮菜鸟一把,谢谢!!
  • 在 ASP 中的VBSCRIPT 语句中可以自定义变量吗?
  • 编写ASP组件遇到的自定义类型问题。
  • asp怎么取得表单的自定义属性!
  • 非常简单asp问题:自定义函数中的if用法
  • 关于ASP自定义函数的问题!
  • asp下如何调用数据库中自定义的函数

关键词

  • .net
  • asp.net
  • 函数
  • 代码
  • 虚拟
  • httpworkerrequest
  • 调用
  • 处理
  • webhost
  • 根目录

得分解答快速导航

  • 帖主:Dlwang2002

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo