一、简易的web服务器原理
1.socket传输,制定响应包状态,包头包体,传输通讯。
2.简化TCP传输-基于TCPListener的web服务器
3.简化HTTP传输-基于HTTPListener的WEB服务器
二、请求处理:进入ASP.NET、
1.应用程序域:程序集管理的最小逻辑单位(AppDomain),有4大特点
1.隔离:不同程序域间不能直接访问,跨程序域访问的对象,必须派生自System.MarshalByRefObject
2.卸载:被加载的程序集,只能以应用程序域为单位卸载
3.安全:
4.配置:
2.ASP.NET将网站应用程序寄宿在一个独立的应用程序域中,以便于管理。
3.创建web应用程序域:ApplicationHost的静态方法CreateApplicationHost(Type hostType,string virDir,string phyDir)
4.处理请求对象封装在SimpleWorkerRequest(string page(页面名称.aspx),string query(请求参数), TextWriter output(内容输出流)):HttpWorkerRequest
5.System.Web.HttpRuntime类是整个ASP.NET服务器处理的入口
静态属性:反映web应用程序域的设置信息,如AppDomainAppPath web应用程序的文件目录等
静态方法(ProcessRequest(HttpWorkerRequest))处理请求
对参数HttpWorkerRequest分析和分解,创建方便用于网站应用程序处理用的对象HttpRequest和HttpResponse
6.辅助常用工具类HttpServerUtility
1.html和url encode 与decode
7.UA User-Agent :Mozilla/5.0.......Firefox/3.6.6 MSIE8.0
Microsoft.NET\Framework\4.0\Config\Browers
类:HttpBrowerCapabilities Brower
8.自定义asp.net web服务器
1.创建WebServer类:MarshalByRefObject----//该类一个对象实例作为与监听程序之间的通讯对象,跨域,所以要继承该类
2.创建处理请求方法:ProcessRequest(string page,string query,System.IO.TextWriter writer) ----//跨域访问,参数必须支持序列化
3.将参数封装到SimpleWorkerRequest对象实例,通过HttpRuntime进行处理(.ProcessRequest)
Public class WebServer:MarshalByRefObject { public void ProcessRequest( string page, string query, system.io.textwriter writer) { system.web.hosting.SimpleWorkerRequest worker= new system.web.hosting.SimpleWorkerRequest( page,query,writer); system.web.HttpRuntime.ProcessRequest(worker);}}
4. 创建监听程序
1.创建ProcessRequestHandler 委托,用于设置监听程序接收请求后实际调用的方法引用。
2.this.ProcessRequest(request.url.AbsolutePath,request.url.query,system.io.StringWriter); ----//利用委托调用ASP.NET服务器进行处理
3.StringWriter.Tostring()返回处理结果,sw.close();
4.Response.ContentLength ,Response.ContentType, Content 返回响应包
5.创建web应用程序域,启动网站------部署程序域
Type type=typeof(ASPNET.Server.WebServer);
ASPNET.Server.WebServer server =CreateWorkerAppDomainWithHost("/","e:\\website\\", type) as ASPNET.Server.WebServer
6.启动网站
SimpleHttpListener handler = new SimpleHttpListener ();
handler.SetProcessRequest (server.ProcessRequest);
handler.Run();