色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[下篇]

  ASP.NET Process Model索引

  • ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI
  • ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[上篇]
  • ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[下篇]

  二、ASP.NET Runtime Pipeline

  現(xiàn)在我們真正進(jìn)入ASP.NET管轄的范疇,下圖基本上囊括整個(gè)處理過程涉及的對(duì)象,接下來我們一起來討論這一系列的對(duì)象如何相互協(xié)作去處理Http Request,并最終生成我們所需的Http Response。

  HttpContext

  上面我們介紹了ISAPI在調(diào)用ISAPIRuntime的時(shí)候?qū)?duì)應(yīng)的ISAPI ECB Pointer作為參數(shù)傳遞給了ProcessRequest方法,這個(gè)ECB pointer可以看成是托管環(huán)境和非托管環(huán)境進(jìn)行數(shù)據(jù)交換的唯一通道,Server Variable和Request Parameter通過它傳入ASP.NET作為進(jìn)一步處理的依據(jù),ASP.NET最后生成的Response通過它傳遞給ISAPI,并進(jìn)一步傳遞給IIS最終返回到Client端。

  借助這個(gè)傳進(jìn)來的ECB Pointer,我們創(chuàng)建了一個(gè)ISAPIWorkerRequest。ISAPIWorkerRequest作為參數(shù)傳入HttpRuntime.ProcessRequestNoDemand的調(diào)用。HttpRuntime.ProcessRequestNoDemand最終體現(xiàn)在調(diào)用ProcessRequestInternal。下面是真?zhèn)€方法的實(shí)現(xiàn):

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("<html><body>Bad Request</body></html>");
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);
}
}

NET技術(shù)ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[下篇],轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 丹棱县| 牡丹江市| 博白县| 微山县| 西平县| 荆门市| 夏津县| 奎屯市| 柘城县| 白山市| 西乡县| 建湖县| 凯里市| 新源县| 孟连| 昆山市| 绍兴市| 安顺市| 布尔津县| 舟曲县| 杭锦后旗| 漳州市| 绥芬河市| 深泽县| 将乐县| 专栏| 沈丘县| 永康市| 万全县| 临夏市| 民县| 平塘县| 普兰店市| 德阳市| 沧州市| 枣阳市| 万源市| 宁乡县| 钟祥市| 诏安县| 太仓市|