知识大全 Asp.net的处理机制和自定义WebServer
Posted 宿主
篇首语:最淡的墨水,也胜过最强的记性。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Asp.net的处理机制和自定义WebServer相关的知识,希望对你有一定的参考价值。
Asp.net的处理机制和自定义WebServer 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们分 个部分来讨的处理过程 这里我们主要讨论WebApplication以上的两个部分 中间会对比IIS在中的角色
了解这些过程之后 我们就可以定义自己的WebServer WebServer不是只有IIS的 没了它 asp程序照样过日子 这里使用的例子是WebMatrix的WebHost的实现 通过修改这些类 来实现我自己的一个小功能 Host为每个WebApp分配一个ServiceManager的实例 (没有版权问题吧?)
开始吧
第一部分 WebHost从端口侦听请求 接受请求 形成HttpWorkerRequest
创建socket端口接听 listener而已
创建WebHost 通提供的ApplicationHost CreateApplicationHost(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开始运行 然后就到了网页处理了
通过调用System Web HttpRuntime ProcessRequest(HttpWorkerRequest wr)静态函数来进入这个处理
System Web HttpRuntime接受到HttpWorkerRequest对象 看看这个函数 public static void ProcessRequest(HttpWorkerRequest wr)
//忽略其他细节
HttpContext context = new HttpContext(wr false);//根据HttpWorkerRequest创建context 可以看出HttpWorkerRequest是contxt的基础
IHttpHandler handler = HttpApplicationFactory GetApplicationInstance(context );//根据context创建App实例
handler ProcessRequest(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的这几个类的定义
WebMatrix Server 这个类是用来向外提供操作接口的类 继承自MarshalByRefObject 可以跨域调用 主要操作 CreateHost(根据端口号 虚拟目录 物理根目录等信息创建WebHost) StopWebServer(停止服务) StartWebServer(启动服务)等 关键代码 host=ApplicationHost CreateApplicationHost(typeof(Host) this _virtualPath this _physicalPath);者是用来创建Host的代码
WebMatrix Host 这是为每个WebApp创建处理进程空间的宿主类 继承自MarshalByRefObject 主要操作 OnSocketAcceptnew connection connection ProcessOneRequest(host this) 在接受到socket之后 调用处理请求
WebMatrix Connection 连接处理 主要部分 调用Request rocessOneRequest() Request request = new Request(this _host this this _serviceManager); request Process();
WebMatrix Request 重点 继承自SimpleWorkerRequest SimpleWorkerRequest继承自HttpWorkerRequest 而HttpWorkerRequest就是宿主和WebApp唯一的连接点 是WebApp唯一的入口参数 这个类主要重写Process方法 通过调用HttpRuntime ProcessRequest(this)这句代码来进行WebApp的处理
好了 现在来完成我自己的一个小功能 先获取Matrix的WebServer的源代码 通过Reflector工具 修改Request类 就是那个继承自SimpleWorkerRequest的那个类 加一个属性 ServiceManager 修改Host和Server 使之可以向Request传递ServiceManager 使用 在每个WebApp里可以这样使用IServiceProvider p=(IServiceProvider)HttpContext Current;Request wr=(Request)p GetService(typeof(HttpWorkerRequest));object o=wr ServiceManager; 比如这是在一个网页的page_load里面
注意事项 :物理根目录就像root一样 使整个site的根目录 比如c:\\maxsoft site
虚拟目录相对于根目录之后的位置 比如c:\\maxsoft site\\myTest的虚拟目录就是/myTest
端口号随意制定 只要不和系统的冲突就可以 比如
访问方式目标机器:端口号/虚拟目录/文件名 比如x
安装一定要在物理根目录的bin文件夹里面放有本WebServer程序 比如要把 Maxplatform UI Web WebHost dll 拷贝到c:\\maxsoft site\\bin\\目录下 这个文件是编译有WebHost类的那个程序集
cha138/Article/program/net/201311/12097相关参考
ASP.NET自定义错误处理页面的添加 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 自定义错误
ASP.NET的错误处理机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 对于一个Web应用程
ASP.netMVC自定义错误处理页面 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在ASPN
ASP.NET自定义错误页面 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ASPNET提供三种
Asp.NET自定义DataGrid控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一&nb
Asp.net2.0自定义控件开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! (一)概述
ASP.NET自定义输出缓存提供程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们知道自从
ASP.NET中的自定义脚本回调 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ASPNET客户
使用ASP.Net中的自定义控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! if((data
Asp.net用户控件添加自定义事件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n