我们分个部分来讨的处理过程这里我们主要讨论WebApplication以上的两个部分中间会对比IIS在中的角色
了解这些过程之后我们就可以定义自己的WebServerWebServer不是只有IIS的没了它asp程序照样过日子
这里使用的例子是WebMatrix的WebHost的实现通过修改这些类来实现我自己的一个小功能Host为每个WebApp分配一个ServiceManager的实例(没有版权问题吧?)
开始吧
第一部分WebHost
从端口侦听请求接受请求形成HttpWorkerRequest
创建socket端口接听
listener而已
创建WebHost
通提供的ApplicationHostCreateApplicationHost(typeof(Host) virtualPath physicalPath)静态函数来创建处理的宿主空间
这个Host继承自MarshalByRefObject可以跨程序域调用这是关键因为每个WebApp会被分配一个AppDomain进行运行所以Host要可以创建这些AppDomain并且可以调用
实现抽象类HttpWorkerRequest
提供了一个SimpleWorkerRequest的实现简单的可以直接调用它复杂一点的话需要自己重写更多的方法
这个类就是封装了所有向下传递的属性和数据
这时WebHost和具体的每个WebApp的唯一连接点
第二部分处理HttpWorkerRequest
根据HttpWorkerRequest实例化出HttpContext和IHttpHandler 这部分好像就进内部的几个类了不知道能不能在控制
HttpRuntime的第一次处理
根据HttpWorkerRequest 创建context根据contxt创建IHttpHandler实例hanlder根据这个context开始运行然后就到了网页处理了
通过调用SystemWebHttpRuntimeProcessRequest(HttpWorkerRequest wr)静态函数来进入这个处理
SystemWebHttpRuntime接受到HttpWorkerRequest对象看看这个函数
public static void ProcessRequest(HttpWorkerRequest wr)
{
//忽略其他细节
HttpContext context = new HttpContext(wr false);//根据HttpWorkerRequest创建context可以看出HttpWorkerRequest是contxt的基础
IHttpHandler handler = HttpApplicationFactoryGetApplicationInstance(context);//根据context创建App实例
handlerProcessRequest(context);//运行实例参数是context
}
HttpContext(HttpWorkerRequest false)
创建HttpContext根据HttpWorkerRequest
只看这两句就行
request=new HttpRequest(wr this)
response=new HttpResponse(wr this);
request和response都是依据wr构造的
再看看HttpRequest是如何构造的
这是原代码
internal HttpRequest(HttpWorkerRequest wr HttpContext context)
{
this_contentLength = ;
this_wr = wr;
this_context = context;
}
第三部分网页处理既然已经产生了IHttpHandler和HttpContext了剩下的就到了具体的每个WebApp了
IHttpHandler之后就到了每个页面了成了WebApplition具体的不说了
这时候的handler就已经获得了HttpContext了
其中IIS作的好像就是第一部分的功能我们自己做一个宿主的话也主要是完成第一部分
看看WebMatrix的这几个类的定义
WebMatrixServer
这个类是用来向外提供操作接口的类继承自MarshalByRefObject可以跨域调用
主要操作CreateHost(根据端口号虚拟目录物理根目录等信息创建WebHost)StopWebServer(停止服务)StartWebServer(启动服务)等
关键代码host=ApplicationHostCreateApplicationHost(typeof(Host) this_virtualPath this_physicalPath);者是用来创建Host的代码
WebMatrixHost
这是为每个WebApp创建处理进程空间的宿主类继承自MarshalByRefObject
主要操作
OnSocketAccept{new connectionconnectionProcessOneRequest(hostthis)}
在接受到socket之后调用处理请求
WebMatrixConnection
连接处理
主要部分调用Request
rocessOneRequest()
{
Request request = new Request(this_hostthisthis_serviceManager);
requestProcess();
}
WebMatrixRequest
重点继承自SimpleWorkerRequestSimpleWorkerRequest继承自HttpWorkerRequest而HttpWorkerRequest就是宿主和WebApp唯一的连接点是WebApp唯一的入口参数
这个类主要重写Process方法通过调用HttpRuntimeProcessRequest(this)这句代码来进行WebApp的处理
好了现在来完成我自己的一个小功能
先获取Matrix的WebServer的源代码通过Reflector工具
修改Request类就是那个继承自SimpleWorkerRequest的那个类加一个属性ServiceManager
修改Host和Server使之可以向Request传递ServiceManager
使用在每个WebApp里可以这样使用
IServiceProvider p=(IServiceProvider)HttpContextCurrent;
Request wr=(Request)pGetService(typeof(HttpWorkerRequest));
object o=wrServiceManager;
比如这是在一个网页的page_load里面
注意事项
:物理根目录
就像wwwroot一样使整个site的根目录比如c:\maxsoftsite
虚拟目录
相对于根目录之后的位置比如c:\maxsoftsite\myTest的虚拟目录就是/myTest
端口号
随意制定只要不和系统的沖突就可以比如
访问方式
目标机器:端口号/虚拟目录/文件名比如x
安装
一定要在物理根目录的bin文件夹里面放有本WebServer程序
比如要把MaxplatformUIWebWebHostdll拷贝到c:\maxsoftsite\bin\目录下
这个文件是编译有WebHost类的那个程序集
问题WebPart不能显示
只有在vs自带的web服务程序上才能显示好像用IIS也不行
看vs的webserver的代码它使用了 HostingEnvironmentDispatchRequest(this);函数
难道它不使用HTTPRuntime