iis处理请求随记回顾

----http是无状态的,

每次http请求户不影响,都是独立的;不会记的上次请求;

-------iis原理:输入地址--socket封装请求体报文--发送---iis解析封装响应体---返回;

----httpcontext-两个对象:httprequest(封装http请求)和httpResponse(封装相应响应);

---请求的报文

httprequest解析请求报文,分割请求体的各个部分;

---请求原理总结:

发送一个请求----有httpApplication的processrequest方法 创建一个httpcontext上下文--

并将请求报文信息封装到httpcontext上下文的httprequest中,并创建响应报文httpresponse;

--代码:

//将请求报文封装

1.HttpContext context=new HttpContext("requestr");

//封装响应

2.HttpApplication application=new HttpApplication();

3.application.ProcessRequest(context);

//发送相应报文:(头部和主体)

4.socket.Send(context.Response.GetHeader());

4.socket.Send(context.Response.BodyData());

 

----HttpApplication.ProcesssRequet的内部实现

public class HttpApplication

{

   public void processRequest(hhttpContext context)

   {

      //处理当前请求,并将相应正文放入response中

      //处理静态文件js,css,html,htm

      //模拟请求静态页面(根据请求判断css,jpg,js,html等类型)

      //获取服务端绝对路径

      string currenturl=AppDomain.CurrentDomain,baseDirectory;

      //拼接总路径

       string fileName=path.combine(currenturl,context.request.requesturl);

       context.response.bodydata=file.readallbytes(filename);

   }

}

----处理动态页面的实现:

public void ProcessDynamicFile(httpcontext context)

{

   //获取请求类文件即类名

   string classname=path.getfilenamewithoutextension(context.request.requesturl);

   //通过反射获取当前命名空间

   string namespace=system.reflection.methodbase.getcurrentMethod   ().DeclaringType.Namespace;

   //拼接

   string fullname=namespace+"."+className;

   //因为每页页面实现Ihttphander(内部封装了ProcessRequest(context)方法;

   IhttpHandler obj=(IhttpHandler)System.reflation.Assembly.getexecutingassembly().

   createinstance(fullName,true);

   obj.processRequest(context);

}

posted @ 2013-11-23 17:07  aiaito  阅读(327)  评论(0编辑  收藏  举报