随机文章
热门推荐

Asp.Net底层原理(二、写自己的Asp.Net框架)

发布时间:2017-09-12 15:24:27
Asp.Net底层原理(二、写自己的Asp.Net框架) 写自己的Asp.Net框架,我们不会引用System.Web这个程序集,我们只需要创建要给自己的类库,所以在接下来的程序中,我们所用到的Web组件都是我们自己定义的。

首先创建一个程序集名为MyWebApplication,定义了如下一个HttpContext类型,它封装了上下文对象。

一、HttpContext定义了三个属性:

表示当前服务器请求——HttpRequest

服务器响应——HttpResponse

一个"工具类"——HttpServerUtility

public class HttpContext

{

public HttpContext(string strRequest);

public HttpRequest Request { get; }

public HttpResponse Response { get; }

public HttpServerUtility Server { get; set; }

}

与真实的底层有些差别,真实的底层,上下文封装比较繁琐,当然它足够强大。

在这里,我们就简单的讲请求报文进行分类,把分类的数据结果交给HttpRequest来保管:

HttpRequest的构造函数,接受一个请求报文,对请求报文进行截取分类,

我们在这里就只挑拣两个必须的用到的数据url和httpMethod。

NameValueCollection是一个字典类型的集合,它对Get请求的数据进行了封装,以供我们可以根据不同的参数获取不同的响应数据 Request.QueryString[]嘛,很熟悉吧。

public class HttpRequest

{

public HttpRequest(string strRequest);

public string HttpMethod { get; set; }

public NameValueCollection QueryString { get; set; }

public string Url { get; set; }

}

HttpResponse里提供了Write方法,最后输出都要转换为byte字节的,Write(stringresponseStr)的方法是对输出的文本进行累加,输出的时候统一转为了byte字节。 CreateResponseContent这个方法就是在输出的时候对响应报文(ResponseBody和ResponseHead)进行了整合。

public class HttpResponse

{

public HttpResponse(HttpRequest request);

public HttpRequest Request { get; set; }

public byte[] ResponseBody { get; }

public byte[] ResponseHeader { get; set; }

public void CreateResponseContent();

public void Write(byte[] b);

public void Write(string responseStr);

}

HttpServerUtility就提供了一个方法,为了替换Html模板,对虚拟路径与程序集下的物理路径进行了映射:

public class HttpServerUtility : MarshalByRefObject

{

public HttpServerUtility();

public string MapPath(string path);

}

二、HttpApplication对象

这个对象是构成Asp.Net管道的核心对象,实际的HttpApplication是通过反射的方式来创建的,而且此方法要抽象很多,我们在下一篇文章会介绍实际的HttpApplication是怎么回事。

我们的HttpApplication里面定义了19个事件,HttpModule就是对这些事件进行注册。

InitInternal方法是HttpApplication的初始化方法,专题,它在ProcessRequest方法里会被执行;InitInteranl方法中,调用了一个InitModules方法初始化所有的HttpModele。

ProcessRequest方法是绑定并开始执行所有HttpModule里注册的事件,并在第7-8个事件根据请求的url路径,

通过反射的方式创建了HttpHandler,在第11-12个时间中执行了HttpHandler的ProcessRequest方法。

public class HttpApplication : IHttpHandler

{

public HttpApplication();

public HttpContext Context { get; set; }

public event EventHandler AcquireRequestState;

public event EventHandler AunthorizeRequest;

public event EventHandler AuthenticateRequest;

public event EventHandler BeginRequest;

public event EventHandler EndRequest;

public event EventHandler LogRequest;

public event EventHandler PostAcquireRequestState;

public event EventHandler PostAuthenticateRequest;

public event EventHandler PostAuthorizeRequest;

public event EventHandler PostLogRequest;

public event EventHandler PostMapRequestHandler;

public event EventHandler PostReleaseRequestState;

public event EventHandler PostRequestHandlerExecute;

public event EventHandler PostResolveRequestCache;

public event EventHandler PostUpdateRequestCache;

public event EventHandler PreRequestHandlerExecute;

public event EventHandler ReleaseRequestState;

public event EventHandler ResolveRequestCache;

public event EventHandler UpdateRequestCache;

private void InitModules();

public void InitInternal();

public void ProcessRequest(HttpContext context);

}

HttpModule:

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:天门SEO http://tianmen.4567w.com

板栗  武汉网站建设  SEO  代办公司注册  武汉做网站  武汉网站制作 
本站所有原创信息,未经许可请勿任意转载或复制使用
COPYRIGHT © 2015 浑源新闻网 ALL RIGHTS RESERVED.