武汉网站建设,武汉软件开发,武汉网站优化 武汉网站建设,武汉软件开发,武汉网站优化
繁体中文 设为首页 加入收藏 思派尔数据 思派尔商城 思派尔邮局 思派尔论坛 建站系统 在线客服 博客 登录
咨询热线027-87780042 13437105200 

新闻分类

网站系统
病毒防治
思派尔学院
经营方案

热点推荐

学习Div+CSS从何入手技术-Web
CSS标准系列标准下各种浏览器
如何用CSS选择器查询和风格化
web标准,我们去向何方?一些
Opera下cloneNode的bug-Web标
网页设计配色基础:RGB与HSB-
一个网友观点:两年以来使用D
Web标准:讨论内容结构表现行
IE与FF浏览器CSS兼容技巧-Web
WEB标准使我们的思维模式进行
当前位置:解决方案 >> 思派尔学院 >> ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II(1)
ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II(1)
2008-09-08 11:38:14  作者:思派尔科技  来源:思派尔科技  浏览次数:993  文字大小:[] [] []
网站建设,武汉网站建设,湖北网站建设,网站建设公司,武汉网络公司,网站优化,网络公司,虚拟主机,域名注册,软件开发
【引自Artech的博客】二、ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I)

现在我们真正进入ASP.NET管辖的范畴,下图基本上囊括整个处理过程涉及的对象,接下来我们一起来讨论这一系列的对象如何相互协作去处理Http Request,并最终生成我们所需的Http Response。

图1

HttpContext

上面我们介绍了ISAPI在调用ISAPIRuntime的时候将对应的ISAPI ECB Pointer作为参数传递给了ProcessRequest方法,这个ECB pointer可以看成是托管环境和非托管环境进行数据交换的唯一通道,Server Variable和Request Parameter通过它传入ASP.NET作为进一步处理的依据,ASP.NET最后生成的Response通过它传递给ISAPI,并进一步传递给IIS最终返回到Client端。

借助这个传进来的ECB Pointer,我们创建了一个ISAPIWorkerRequest。ISAPIWorkerRequest作为参数传入HttpRuntime.ProcessRequestNoDemand的调用。HttpRuntime.ProcessRequestNoDemand最终体现在调用ProcessRequestInternal。下面是真个方法的实现:

ProcessRequestInternal
private void ProcessRequestInternal(HttpWorkerRequest wr)
{
HttpContext context;
try
{
context = new HttpContext(wr, false);
}
catch
{
wr.SendStatus(400, "Bad Request");
wr.SendKnownResponseHeader(12, "text/html; charset=utf-8");
byte[] bytes = Encoding.ASCII.GetBytes("Bad Request");
wr.SendResponseFromMemory(bytes, bytes.Length);
wr.FlushResponse(true);
wr.EndOfRequest();
return;
}
wr.SetEndOfSendNotification(this._asyncEndOfSendCallback, context);
Interlocked.Increment(ref this._activeRequestCount);
HostingEnvironment.IncrementBusyCount();
try
{
try
{
this.EnsureFirstRequestInit(context);
}
catch
{
if (!context.Request.IsDebuggingRequest)
{
throw;
}
}
context.Response.InitResponseWriter();
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance

(context);
if (applicationInstance == null)
{
throw new HttpException(SR.GetString("Unable_create_app_object"));
}
if (EtwTrace.IsTraceEnabled(5, 1))
{
EtwTrace.Trace(EtwTraceType.ETW_TYPE_START_HANDLER, context.WorkerRequest,

applicationInstance.GetType().FullName, "Start");
}
if (applicationInstance is IHttpAsyncHandler)
{
IHttpAsyncHandler handler2 = (IHttpAsyncHandler) applicationInstance;
context.AsyncAppHandler = handler2;
handler2.BeginProcessRequest(context, this._handlerCompletionCallback, context);
}
else
{
applicationInstance.ProcessRequest(context);
this.FinishRequest(context.WorkerRequest, context, null);
}
}
catch (Exception exception)
{
context.Response.InitResponseWriter();
this.FinishRequest(wr, context, exception);
}
}

对象上面的代码没有必要深究,我们只需要了解大体的执行流程就可以了,下面这一段伪代码基本上体现整个执行过程:

HttpContext context = new HttpContext(wr, false);
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);


首先通过创建的ISAPIWorkerRequest创建按一个HttpContext对象,随后通过HttpApplicationFactory.GetApplicationInstance创建一个IHttpHandler对象(一般情况下就是一个HttpApplication对象)。

正如他的名字体现的,HttpContext体现当前Request的上下文信息,它的生命周期知道整个Request处理结束或者处理超时。通过HttpContext对象我们可以访问属于当前Request的一系列常用的对象:Server,Session,Cache,Application,Request,Response,Trace,User,Profile等等。此外我们可以认为将一些数据放在Items属性中作为状态管理的一种方式,不过这种状态管理和其他一些常用的方式,比如Session,Cache,Application,Cookie等,具有根本性的不同之处是其生命周期仅仅维持在当前Request的Context中。



相关文章
在线咨询:
网站建设  软件开发  武汉网站建设  武汉网站建设     咨询电话:(027)-87780042  (027)-87171045  (移)13437105200  (联)13072712700