HttpRuntime的認識與加深理解

iDotNetSpace發表於2009-10-16
下面最先介紹HttpRuntime的Web.config裡的配置
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt<httpRuntime
   executionTimeout 
= "number" 
   maxRequestLength 
= "number" 
   requestLengthDiskThreshold 
= "number" 
   useFullyQualifiedRedirectUrl 
= "[True|False]" 
   minFreeThreads 
= "number" 
   minLocalRequestFreeThreads 
= "number" 
   appRequestQueueLimit 
= "number"
   enableKernelOutputCache 
= "[True|False]" 
   enableVersionHeader 
= "[True|False]" 
   apartmentThreading 
= "[True|False]"
   requireRootedSaveAsPath 
= "[True|False]"
   enable 
= "[True|False]" 
   sendCacheControlHeader 
= "[True|False]" 
   shutdownTimeout 
= "number"
   delayNotificationTimeout 
= "number"
   waitChangeNotification 
= "number" 
   maxWaitChangeNotification 
= "number" 
   enableHeaderChecking 
= "[True|False]" 
/>
通過上面的配置說明, 下面是在Web.Config裡節點的設定
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt<configuration>
  
<system.web>
  
<httpRuntime maxRequestLength="4000"
    enable 
= "True"
    requestLengthDiskThreshold
="512
    useFullyQualifiedRedirectUrl="True"
    executionTimeout
="45"
    versionHeader
="1.1.4128"/>
  
system.web>
configuration>

IIS 所收到的對某 Microsoft ASP.NET 頁面的每個請求都被移交給 ASP.NET HTTP 管線。HTTP 管線由一系列託管物件組成,這些物件按順序處理該請求,並完成從 URL 到普通 HTML 文字的轉換。HTTP 管線的入口點是 HttpRuntime 類。ASP.NET 基礎結構為輔助程式中所承載的每個 AppDomain 建立此類的一個例項請注意,該輔助程式為當前正在執行的每個 ASP.NET 應用程式維護一個不同的 AppDomain。

要啟用 HTTP 管道,可以建立一個 HttpRuntime 類的新例項,然後呼叫其 ProcessRequest 方法。一個完整的頁面請求會包括下面的流程:
首先被WWW伺服器截獲(inetinfo.exe程式), 該程式首先判斷頁面字尾, 然後根據IIS中配置決定呼叫具體的擴充套件程式。aspx就會呼叫aspnet_isapi.dll,
然後由aspnet_isapi.dll傳送給w3wp.exe(iis 工作者程式,IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe)。

接下來在w3wp.exe呼叫.NET類庫進行具體處理,順序如下:ISAPIRuntim, HttpRuntime, HttpApplicationFactory, HttpApplication, HttpModule, HttpHandlerFactory, HttpHandle

ISAPIRuntime:主要作用是呼叫一些非託管程式碼生成HttpWorkerRequest物件,HttpWorkerRequest物件包含當前請求的所有資訊,然後傳遞給HttpRuntime
HttpRuntime:根據HttpWorkerRequest物件生成HttpContext,HttpContext包含request、response等屬性, 再呼叫HttpApplicationFactory來生成IHttpHandler, 呼叫HttpApplication物件執行請求
HttpApplicationFactory: 生成一個HttpApplication物件
HttpApplication:進行HttpModule的初始化,HttpApplication建立針對此Http請求的 HttpContext物件
HttpModule: 當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何處理,也就是說此時對於HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的資訊在這個HTTP請求資訊之上,或者針對截獲的這個HTTP請求資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。
HttpHandlerFactory:把使用者request 轉發到HttpHandlerFactory,再由HttpHandlerFactory例項化HttpHandler物件來相應request
HttpHandle:Http處理程式,處理頁面請求

從上面看出HttpRuntime其中有一個ProcessRequest 方法
public static void ProcessRequest(HttpWorkerRequest wr);  //驅動所有 ASP.NET Web 處理執行。虛擬碼如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpublic static void HttpRuntime.ProcessRequest(HttpWorkerRequest wr)
 {
   
// 檢查當前呼叫者有沒有作為ASP.NET宿主(Host)的許可權
   InternalSecurityPermissions.AspNetHostingPermissionLevelMedium.Demand(); 

   
if(wr == null)
   {
     
throw new ArgumentNullException("custom");
   }

   RequestQueue queue 
= HttpRuntime._theRuntime._requestQueue;

   
if(queue != null)
   {
     
// 將引數中的Web頁面請求放入請求佇列中, 並從佇列中使用FIFO策略獲取一個頁面請求
     wr = queue.GetRequestToExecute(wr);
   }

   
if(wr != null)
   {     
     HttpRuntime.CalculateWaitTimeAndUpdatePerfCounter(wr); 
// 更新效能計數器     
      HttpRuntime.ProcessRequestNow(wr); // 實際完成頁面請求工作
   }
 }

ProcessRequestNow函式則直接呼叫預設HttpRuntime例項的ProcessRequestInternal函式完成實際頁面請求工作,虛擬碼如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtinternal static void HttpRuntime.ProcessRequestNow(HttpWorkerRequest wr)
{
   HttpRuntime._theRuntime.ProcessRequestInternal(wr);
}

ProcessRequestInternal函式邏輯稍微複雜一些,大致可分為四個部分:
檢查當前HttpRuntime例項是否第一次被呼叫,如果是第一次呼叫則通過FirstRequestInit函式初始化
呼叫HttpResponse.InitResponseWriter函式初始化頁面請求的返回物件HttpWorkerRequest.Response
呼叫HttpApplicationFactory.GetApplicationInstance函式獲取當前 Web 應用程式例項
使用Web應用程式例項完成實際的頁面請求工作
虛擬碼如下:

HttpRuntime的認識與加深理解
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtprivate void HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
 {
   
// 構造 HTTP 呼叫上下文物件
   HttpContext ctxt = new HttpContext(wr, 0); 

   
// 設定傳送結束非同步回撥函式
   wr.SetEndOfSendNotification(this._asyncEndOfSendCallback, ctxt);

   
// 更新請求計數器
   Interlocked.Increment(&(this._activeRequestCount));

   
try
   {
     
// 檢查當前HttpRuntime例項是否第一次被呼叫
     if(this._beforeFirstRequest)
     {
       
lock(this)
       {
         
// 使用 Double-Checked 模式 避免冗餘鎖定
         if(this._beforeFirstRequest)
         {
           
this._firstRequestStartTime = DateTime.UtcNow;
           
this.FirstRequestInit(ctxt); // 初始化當前 HttpRuntime 執行時環境
           this._beforeFirstRequest = false;
         }
       }
     }

     
// 根據配置檔案設定,扮演具有較高特權的角色
     ctxt.Impersonation.Start(truefalse);
     
try
     {
       
// 初始化頁面請求的返回物件
       ctxt.Response.InitResponseWriter();
     }
     
finally
     {
       ctxt.Impersonation.Stop();
     }

     
// 獲取當前 Web 應用程式例項
     IHttpHandler handler = HttpApplicationFactory.GetApplicationInstance(ctxt);

     
if (handler == null)
     {
       
throw new HttpException(HttpRuntime.FormatResourceString("Unable_create_app_object"));
     }

     
// 使用Web應用程式例項完成實際的頁面請求工作
     if((handler as IHttpAsyncHandler) != null)
     {
       IHttpAsyncHandler asyncHandler 
= ((IHttpAsyncHandler) handler);
       ctxt.AsyncAppHandler 
= asyncHandler;
       
// 使用非同步處理機制
       asyncHandler.BeginProcessRequest(ctxt, this._handlerCompletionCallback, ctxt);
     }
     
else
     {
       handler.ProcessRequest(ctxt);
       
this.FinishRequest(ctxt.WorkerRequest, ctxt, null);
     }
   }
   
catch(Exception E)
   {
     ctxt.Response.InitResponseWriter();
     
this.FinishRequest(wr, ctxt, E);
   }
 }

HttpRuntime.ProcessRequestInternal函式中呼叫了HttpApplicationFactory.GetApplicationInstance函式獲取當前 Web 應用程式例項。至少HttpRuntime已經完完成,將轉進HttpApplicationFactory階段流程。大家可以看到,圍繞HttpRuntime的函式都有一個HttpWorkerRequest引數,下面簡單介紹一下這個引數的作用。在ISAPIRuntime階段,呼叫一些非託管程式碼生成HttpWorkerRequest物件,該物件包含當前請求的所有資訊,然後傳遞給HttpRuntime,這裡生成的HttpWorkerRequest物件可以直接在我們的頁面裡呼叫.
IServiceProvider provider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
然後可以通過wr來呼叫裡面的方法。關於HttpWorkerRequest類裡面包含的方法,從其後設資料裡面可以看到,如下:

HttpRuntime的認識與加深理解
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpublic abstract class HttpWorkerRequest
    {
        
// 摘要:
        
//     指定 AcceptHTTP 標頭的索引號。
        public const int HeaderAccept = 20;
        
//
        
// 摘要:
        
//     指定 Accept-CharsetHTTP 標頭的索引號。
        public const int HeaderAcceptCharset = 21;
        
//
        
// 摘要:
        
//     指定 Accept-EncodingHTTP 標頭的索引號。
        public const int HeaderAcceptEncoding = 22;
        
//
        
// 摘要:
        
//     指定 Accept-LanguageHTTP 標頭的索引號。
        public const int HeaderAcceptLanguage = 23;
        
//
        
// 摘要:
        
//     指定 Accept-RangesHTTP 標頭的索引號。
        public const int HeaderAcceptRanges = 20;
        
//
        
// 摘要:
        
//     指定 AgeHTTP 標頭的索引號。
        public const int HeaderAge = 21;
        
//
        
// 摘要:
        
//     指定 AllowHTTP 標頭的索引號。
        public const int HeaderAllow = 10;
        
//
        
// 摘要:
        
//     指定 AuthorizationHTTP 標頭的索引號。
        public const int HeaderAuthorization = 24;
        
//
        
// 摘要:
        
//     表示 HTTPCache-ControlHTTP 標頭的索引。
        public const int HeaderCacheControl = 0;
        
//
        
// 摘要:
        
//     指定 ConnectionHTTP 標頭的索引號。
        public const int HeaderConnection = 1;
        
//
        
// 摘要:
        
//     指定 Content-EncodingHTTP 標頭的索引號。
        public const int HeaderContentEncoding = 13;
        
//
        
// 摘要:
        
//     指定 Content-LanguageHTTP 標頭的索引號。
        public const int HeaderContentLanguage = 14;
        
//
        
// 摘要:
        
//     指定 Content-LengthHTTP 標頭的索引號。
        public const int HeaderContentLength = 11;
        
//
        
// 摘要:
        
//     指定 Content-LocationHTTP 標頭的索引號。
        public const int HeaderContentLocation = 15;
        
//
        
// 摘要:
        
//     指定 Content-MD5HTTP 標頭的索引號。
        public const int HeaderContentMd5 = 16;
        
//
        
// 摘要:
        
//     指定 Content-RangeHTTP 標頭的索引號。
        public const int HeaderContentRange = 17;
        
//
        
// 摘要:
        
//     指定 Content-TypeHTTP 標頭的索引號。
        public const int HeaderContentType = 12;
        
//
        
// 摘要:
        
//     指定 CookieHTTP 標頭的索引號。
        public const int HeaderCookie = 25;
        
//
        
// 摘要:
        
//     指定 DateHTTP 標頭的索引號。
        public const int HeaderDate = 2;
        
//
        
// 摘要:
        
//     指定 ETagHTTP 標頭的索引號。
        public const int HeaderEtag = 22;
        
//
        
// 摘要:
        
//     指定 ExceptHTTP 標頭的索引號。
        public const int HeaderExpect = 26;
        
//
        
// 摘要:
        
//     指定 ExpiresHTTP 標頭的索引號。
        public const int HeaderExpires = 18;
        
//
        
// 摘要:
        
//     指定 FromHTTP 標頭的索引號。
        public const int HeaderFrom = 27;
        
//
        
// 摘要:
        
//     指定 HostHTTP 標頭的索引號。
        public const int HeaderHost = 28;
        
//
        
// 摘要:
        
//     指定 If-MatchHTTP 標頭的索引號。
        public const int HeaderIfMatch = 29;
        
//
        
// 摘要:
        
//     指定 If-Modified-SinceHTTP 標頭的索引號。
        public const int HeaderIfModifiedSince = 30;
        
//
        
// 摘要:
        
//     指定 If-None-MatchHTTP 標頭的索引號。
        public const int HeaderIfNoneMatch = 31;
        
//
        
// 摘要:
        
//     指定 If-RangeHTTP 標頭的索引號。
        public const int HeaderIfRange = 32;
        
//
        
// 摘要:
        
//     指定 If-Unmodified-SinceHTTP 標頭的索引號。
        public const int HeaderIfUnmodifiedSince = 33;
        
//
        
// 摘要:
        
//     指定 Keep-AliveHTTP 標頭的索引號。
        public const int HeaderKeepAlive = 3;
        
//
        
// 摘要:
        
//     指定 Last-ModifiedHTTP 標頭的索引號。
        public const int HeaderLastModified = 19;
        
//
        
// 摘要:
        
//     指定 LocationHTTP 標頭的索引號。
        public const int HeaderLocation = 23;
        
//
        
// 摘要:
        
//     指定 Max-ForwardsHTTP 標頭的索引號。
        public const int HeaderMaxForwards = 34;
        
//
        
// 摘要:
        
//     指定 PragmaHTTP 標頭的索引號。
        public const int HeaderPragma = 4;
        
//
        
// 摘要:
        
//     指定 Proxy-AuthenticateHTTP 標頭的索引號。
        public const int HeaderProxyAuthenticate = 24;
        
//
        
// 摘要:
        
//     指定 Proxy-AuthorizationHTTP 標頭的索引號。
        public const int HeaderProxyAuthorization = 35;
        
//
        
// 摘要:
        
//     指定 RangeHTTP 標頭的索引號。
        public const int HeaderRange = 37;
        
//
        
// 摘要:
        
//     指定 RefererHTTP 標頭的索引號。
        public const int HeaderReferer = 36;
        
//
        
// 摘要:
        
//     指定 Retry-AfterHTTP 標頭的索引號。
        public const int HeaderRetryAfter = 25;
        
//
        
// 摘要:
        
//     指定 ServerHTTP 標頭的索引號。
        public const int HeaderServer = 26;
        
//
        
// 摘要:
        
//     指定 Set-CookieHTTP 標頭的索引號。
        public const int HeaderSetCookie = 27;
        
//
        
// 摘要:
        
//     指定 TEHTTP 標頭的索引號。
        public const int HeaderTe = 38;
        
//
        
// 摘要:
        
//     指定 TrailerHTTP 標頭的索引號。
        public const int HeaderTrailer = 5;
        
//
        
// 摘要:
        
//     指定 Transfer-EncodingHTTP 標頭的索引號。
        public const int HeaderTransferEncoding = 6;
        
//
        
// 摘要:
        
//     指定 UpgradeHTTP 標頭的索引號。
        public const int HeaderUpgrade = 7;
        
//
        
// 摘要:
        
//     指定 User-AgentHTTP 標頭的索引號。
        public const int HeaderUserAgent = 39;
        
//
        
// 摘要:
        
//     指定 VaryHTTP 標頭的索引號。
        public const int HeaderVary = 28;
        
//
        
// 摘要:
        
//     指定 ViaHTTP 標頭的索引號。
        public const int HeaderVia = 8;
        
//
        
// 摘要:
        
//     指定 WarningHTTP 標頭的索引號。
        public const int HeaderWarning = 9;
        
//
        
// 摘要:
        
//     指定 WWW-AuthenticateHTTP 標頭的索引號。
        public const int HeaderWwwAuthenticate = 29;
        
//
        
// 摘要:
        
//     指定請求的原因。
        public const int ReasonCachePolicy = 2;
        
//
        
// 摘要:
        
//     指定請求的原因。
        public const int ReasonCacheSecurity = 3;
        
//
        
// 摘要:
        
//     指定請求的原因。
        public const int ReasonClientDisconnect = 4;
        
//
        
// 摘要:
        
//     指定請求的原因。預設值為 System.Web.HttpWorkerRequest.ReasonResponseCacheMiss。
        public const int ReasonDefault = 0;
        
//
        
// 摘要:
        
//     指定請求的原因。
        public const int ReasonFileHandleCacheMiss = 1;
        
//
        
// 摘要:
        
//     指定請求的原因。
        public const int ReasonResponseCacheMiss = 0;
        
//
        
// 摘要:
        
//     指定 MaximumHTTP 請求標頭的索引號。
        public const int RequestHeaderMaximum = 40;
        
//
        
// 摘要:
        
//     指定 MaximumHTTP 響應標頭的索引號。
        public const int ResponseHeaderMaximum = 30;

        
// 摘要:
        
//     初始化 System.Web.HttpWorkerRequest 類的新例項。
        protected HttpWorkerRequest();

        
// 摘要:
        
//     獲取 Machine.config 檔案的完整物理路徑。
        
//
        
// 返回結果:
        
//     Machine.config 檔案的物理路徑。
        public virtual string MachineConfigPath { get; }
        
//
        
// 摘要:
        
//     獲取 ASP.NET 二進位制檔案的安裝目錄的物理路徑。
        
//
        
// 返回結果:
        
//     ASP.NET 二進位制檔案的物理目錄。
        public virtual string MachineInstallDirectory { get; }
        
//
        
// 摘要:
        
//     獲取當前請求的 Windows 跟蹤 ID 的對應事件跟蹤。
        
//
        
// 返回結果:
        
//     當前 ASP.NET 請求的跟蹤 ID。
        public virtual Guid RequestTraceIdentifier { get; }
        
//
        
// 摘要:
        
//     獲取根 Web.config 檔案的完整物理路徑。
        
//
        
// 返回結果:
        
//     根 Web.config 檔案的物理路徑。
        public virtual string RootWebConfigPath { get; }

        
// 摘要:
        
//     終止與客戶端的連線。
        public virtual void CloseConnection();
        
//
        
// 摘要:
        
//     由執行庫使用以通知 System.Web.HttpWorkerRequest 當前請求的請求處理已完成。
        public abstract void EndOfRequest();
        
//
        
// 摘要:
        
//     將所有掛起的響應資料傳送到客戶端。
        
//
        
// 引數:
        
//   finalFlush:
        
//     如果這將是最後一次重新整理響應資料,則為 true;否則為 false。
        public abstract void FlushResponse(bool finalFlush);
        
//
        
// 摘要:
        
//     返回當前正在執行的伺服器應用程式的虛擬路徑。
        
//
        
// 返回結果:
        
//     當前應用程式的虛擬路徑。
        public virtual string GetAppPath();
        
//
        
// 摘要:
        
//     返回當前正在執行的伺服器應用程式的物理路徑。
        
//
        
// 返回結果:
        
//     當前應用程式的物理路徑。
        public virtual string GetAppPathTranslated();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回當前 URL 的應用程式池 ID。
        
//
        
// 返回結果:
        
//     始終返回 null。
        public virtual string GetAppPoolID();
        
//
        
// 摘要:
        
//     獲取從客戶端讀入的位元組數。
        
//
        
// 返回結果:
        
//     包含讀取的位元組數的 Long。
        public virtual long GetBytesRead();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,從客戶端發出的請求獲取證書欄位(以 X.509 標準指定)。
        
//
        
// 返回結果:
        
//     包含整個證書內容流的位元組陣列。
        public virtual byte[] GetClientCertificate();
        
//
        
// 摘要:
        
//     獲取證書頒發者(以二進位制格式表示)。
        
//
        
// 返回結果:
        
//     包含以二進位制格式表示的證書頒發者的位元組陣列。
        public virtual byte[] GetClientCertificateBinaryIssuer();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回用於編碼客戶端證書的 System.Text.Encoding 物件。
        
//
        
// 返回結果:
        
//     表示為整數的證書編碼。
        public virtual int GetClientCertificateEncoding();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,獲取與客戶端證書關聯的 PublicKey 物件。
        
//
        
// 返回結果:
        
//     一個 PublicKey 物件。
        public virtual byte[] GetClientCertificatePublicKey();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,則獲取證書開始生效的日期。此日期隨區域設定的不同而不同。
        
//
        
// 返回結果:
        
//     表示證書生效時間的 System.DateTime 物件。
        public virtual DateTime GetClientCertificateValidFrom();
        
//
        
// 摘要:
        
//     獲取證書到期日期。
        
//
        
// 返回結果:
        
//     表示證書失效日期的 System.DateTime 物件。
        public virtual DateTime GetClientCertificateValidUntil();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回當前連線的 ID。
        
//
        
// 返回結果:
        
//     始終返回 0。
        public virtual long GetConnectionID();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回所請求的 URI 的虛擬路徑。
        
//
        
// 返回結果:
        
//     請求的 URI 的路徑。
        public virtual string GetFilePath();
        
//
        
// 摘要:
        
//     返回請求的 URI 的物理檔案路徑(並將其從虛擬路徑轉換成物理路徑:例如,從“/proj1/page.aspx”轉換成“c:\dir\page.aspx”)
        
//
        
// 返回結果:
        
//     請求的 URI 的已轉換的物理檔案路徑。
        public virtual string GetFilePathTranslated();
        
//
        
// 摘要:
        
//     返回請求標頭的指定成員。
        
//
        
// 返回結果:
        
//     請求標頭中返回的 HTTP 謂詞。
        public abstract string GetHttpVerbName();
        
//
        
// 摘要:
        
//     提供對請求的 HTTP 版本(如“HTTP/1.1”)的訪問。
        
//
        
// 返回結果:
        
//     請求標頭中返回的 HTTP 版本。
        public abstract string GetHttpVersion();
        
//
        
// 摘要:
        
//     返回與指定的索引相對應的標準 HTTP 請求標頭。
        
//
        
// 引數:
        
//   index:
        
//     標頭的索引。例如,System.Web.HttpWorkerRequest.HeaderAllow 欄位。
        
//
        
// 返回結果:
        
//     HTTP 請求標頭。
        public virtual string GetKnownRequestHeader(int index);
        
//
        
// 摘要:
        
//     返回指定的 HTTP 請求標頭的索引號。
        
//
        
// 引數:
        
//   header:
        
//     標頭的名稱。
        
//
        
// 返回結果:
        
//     在 header 引數中指定的 HTTP 請求標頭的索引號。
        public static int GetKnownRequestHeaderIndex(string header);
        
//
        
// 摘要:
        
//     返回指定的 HTTP 請求標頭的名稱。
        
//
        
// 引數:
        
//   index:
        
//     標頭的索引號。
        
//
        
// 返回結果:
        
//     在 index 引數中指定的 HTTP 請求標頭的名稱。
        public static string GetKnownRequestHeaderName(int index);
        
//
        
// 摘要:
        
//     返回指定的 HTTP 響應標頭的索引號。
        
//
        
// 引數:
        
//   header:
        
//     HTTP 標頭的名稱。
        
//
        
// 返回結果:
        
//     在 header 引數中指定的 HTTP 響應標頭的索引號。
        public static int GetKnownResponseHeaderIndex(string header);
        
//
        
// 摘要:
        
//     返回指定的 HTTP 響應標頭的名稱。
        
//
        
// 引數:
        
//   index:
        
//     標頭的索引號。
        
//
        
// 返回結果:
        
//     在 index 引數中指定的 HTTP 響應標頭的名稱。
        public static string GetKnownResponseHeaderName(int index);
        
//
        
// 摘要:
        
//     提供對請求標頭的指定成員的訪問。
        
//
        
// 返回結果:
        
//     請求標頭中返回的伺服器 IP 地址。
        public abstract string GetLocalAddress();
        
//
        
// 摘要:
        
//     提供對請求標頭的指定成員的訪問。
        
//
        
// 返回結果:
        
//     請求標頭中返回的伺服器埠號。
        public abstract int GetLocalPort();
        
//
        
// 摘要:
        
//     返回具有 URL 擴充套件的資源的其他路徑資訊。即對於路徑 /virdir/page.html/tail,GetPathInfo 值為 /tail。
        
//
        
// 返回結果:
        
//     資源的附加路徑資訊。
        public virtual string GetPathInfo();
        
//
        
// 摘要:
        
//     返回 HTTP 請求正文已被讀取的部分。
        
//
        
// 返回結果:
        
//     HTTP 請求正文已被讀取的部分。
        public virtual byte[] GetPreloadedEntityBody();
        
//
        
// 摘要:
        
//     使用指定的緩衝區資料和位元組偏移量獲取 HTTP 請求正文當前已被讀取的部分。
        
//
        
// 引數:
        
//   buffer:
        
//     要讀取的資料。
        
//
        
//   offset:
        
//     開始讀取的位置的位元組偏移量。
        
//
        
// 返回結果:
        
//     HTTP 請求正文已被讀取的部分。
        public virtual int GetPreloadedEntityBody(byte[] buffer, int offset);
        
//
        
// 摘要:
        
//     獲取 HTTP 請求正文當前已被讀取部分的長度。
        
//
        
// 返回結果:
        
//     一個整數,包含當前已讀取的 HTTP 請求正文的長度。
        public virtual int GetPreloadedEntityBodyLength();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回 HTTP 協議(HTTP 或 HTTPS)。
        
//
        
// 返回結果:
        
//     如果 System.Web.HttpWorkerRequest.IsSecure() 方法為 true,則為 HTTPS;否則,為 HTTP。
        public virtual string GetProtocol();
        
//
        
// 摘要:
        
//     返回請求 URL 中指定的查詢字串。
        
//
        
// 返回結果:
        
//     請求查詢字串。
        public abstract string GetQueryString();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,以位元組陣列的形式返回響應查詢字串。
        
//
        
// 返回結果:
        
//     包含響應的位元組陣列。
        public virtual byte[] GetQueryStringRawBytes();
        
//
        
// 摘要:
        
//     返回附加了查詢字串的請求標頭中包含的 URL 路徑。
        
//
        
// 返回結果:
        
//     請求標頭的原始 URL 路徑。
        public abstract string GetRawUrl();
        
//
        
// 摘要:
        
//     提供對請求標頭的指定成員的訪問。
        
//
        
// 返回結果:
        
//     客戶端的 IP 地址。
        public abstract string GetRemoteAddress();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回客戶端計算機的名稱。
        
//
        
// 返回結果:
        
//     客戶端計算機的名稱。
        public virtual string GetRemoteName();
        
//
        
// 摘要:
        
//     提供對請求標頭的指定成員的訪問。
        
//
        
// 返回結果:
        
//     客戶端的 HTTP 埠號。
        public abstract int GetRemotePort();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回請求的原因。
        
//
        
// 返回結果:
        
//     原因程式碼。預設值為 ReasonResponseCacheMiss。
        public virtual int GetRequestReason();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回本地伺服器的名稱。
        
//
        
// 返回結果:
        
//     本地伺服器的名稱。
        public virtual string GetServerName();
        
//
        
// 摘要:
        
//     從與請求關聯的伺服器變數詞典返回單個伺服器變數。
        
//
        
// 引數:
        
//   name:
        
//     請求的伺服器變數的名稱。
        
//
        
// 返回結果:
        
//     請求的伺服器變數。
        public virtual string GetServerVariable(string name);
        
//
        
// 摘要:
        
//     返回一個字串,該字串描述指定的 HTTP 狀態程式碼的名稱。
        
//
        
// 引數:
        
//   code:
        
//     HTTP 狀態程式碼。
        
//
        
// 返回結果:
        
//     狀態說明。例如,System.Web.HttpWorkerRequest.GetStatusDescription(System.Int32) (404)
        
//     返回“未找到”。
        public static string GetStatusDescription(int code);
        
//
        
// 摘要:
        
//     獲取整個 HTTP 請求正文的長度。
        
//
        
// 返回結果:
        
//     包含整個 HTTP 請求正文的長度的整數。
        public virtual int GetTotalEntityBodyLength();
        
//
        
// 摘要:
        
//     返回非標準的 HTTP 請求標頭值。
        
//
        
// 引數:
        
//   name:
        
//     標頭名稱。
        
//
        
// 返回結果:
        
//     標頭值。
        public virtual string GetUnknownRequestHeader(string name);
        
//
        
// 摘要:
        
//     獲取所有非標準的 HTTP 標頭的名稱/值對。
        
//
        
// 返回結果:
        
//     標頭的名稱/值對的陣列。
        [CLSCompliant(false)]
        
public virtual string[][] GetUnknownRequestHeaders();
        
//
        
// 摘要:
        
//     返回請求的 URI 的虛擬路徑。
        
//
        
// 返回結果:
        
//     請求的 URI 的路徑。
        public abstract string GetUriPath();
        
//
        
// 摘要:
        
//     當在派生類中被重寫時,返回當前連線的上下文 ID。
        
//
        
// 返回結果:
        
//     始終返回 0。
        public virtual long GetUrlContextID();
        
//
        
// 摘要:
        
//     在派生類中被重寫時,返回客戶端的模擬標記。
        
//
        
// 返回結果:
        
//     表示客戶端的模擬標記的值。預設值為 0。
        public virtual IntPtr GetUserToken();
        
//
        
// 摘要:
        
//     獲取請求虛擬路徑的模擬標記。
        
//
        
// 返回結果:
        
//     請求虛擬路徑的標記的非託管記憶體指標。
        public virtual IntPtr GetVirtualPathToken();
        
//
        
// 摘要:
        
//     返回一個值,該值指示請求是否包含正文資料。
        
//
        
// 返回結果:
        
//     如果請求包含正文資料,則為 true;否則,為 false。
        public bool HasEntityBody();
        
//
        
// 摘要:
        
//     返回一個值,該值指示是否已為當前的請求將 HTTP 響應標頭髮送到客戶端。
        
//
        
// 返回結果:
        
//     如果 HTTP 響應標頭已傳送到客戶端,則為 true;否則,為 false。
        public virtual bool HeadersSent();
        
//
        
// 摘要:
        
//     返回一個值,該值指示客戶端連線是否仍處於活動狀態。
        
//
        
// 返回結果:
        
//     如果客戶端連線仍處於活動狀態,則為 true;否則,為 false。
        public virtual bool IsClientConnected();
        
//
        
// 摘要:
        
//     返回一個值,該值指示是否所有請求資料都可用,以及是否不需要對客戶端進行進一步讀取。
        
//
        
// 返回結果:
        
//     如果所有請求資料都可用,則為 true;否則,為 false。
        public virtual bool IsEntireEntityBodyIsPreloaded();
        
//
        
// 摘要:
        
//     返回一個指示連線是否使用 SSL 的值。
        
//
        
// 返回結果:
        
//     如果連線是 SSL 連線,則為 true;否則為 false。預設值為 false。
        public virtual bool IsSecure();
        
//
        
// 摘要:
        
//     返回與指定虛擬路徑相對應的物理路徑。
        
//
        
// 引數:
        
//   virtualPath:
        
//     虛擬路徑。
        
//
        
// 返回結果:
        
//     與 virtualPath 引數中指定的虛擬路徑相對應的物理路徑。
        public virtual string MapPath(string virtualPath);
        
//
        
// 摘要:
        
//     讀取客戶端的請求資料(在尚未預載入時)。
        
//
        
// 引數:
        
//   buffer:
        
//     將資料讀入的位元組陣列。
        
//
        
//   size:
        
//     最多讀取的位元組數。
        
//
        
// 返回結果:
        
//     讀取的位元組數。
        public virtual int ReadEntityBody(byte[] buffer, int size);
        
//
        
// 摘要:
        
//     使用指定的要從中讀取資料的緩衝區、位元組偏移量和最大位元組數從客戶端讀取請求資料(當未預先載入時)。
        
//
        
// 引數:
        
//   buffer:
        
//     將資料讀入的位元組陣列。
        
//
        
//   offset:
        
//     開始讀取的位置的位元組偏移量。
        
//
        
//   size:
        
//     最多讀取的位元組數。
        
//
        
// 返回結果:
        
//     讀取的位元組數。
        public virtual int ReadEntityBody(byte[] buffer, int offset, int size);
        
//
        
// 摘要:
        
//     將 Content-Length HTTP 標頭新增到小於或等於 2 GB 的訊息正文的響應。
        
//
        
// 引數:
        
//   contentLength:
        
//     響應的長度(以位元組為單位)。
        public virtual void SendCalculatedContentLength(int contentLength);
        
//
        
// 摘要:
        
//     將 Content-Length HTTP 標頭新增到大於 2 GB 的訊息正文的響應。
        
//
        
// 引數:
        
//   contentLength:
        
//     響應的長度(以位元組為單位)。
        public virtual void SendCalculatedContentLength(long contentLength);
        
//
        
// 摘要:
        
//     將標準 HTTP 標頭新增到響應。
        
//
        
// 引數:
        
//   index:
        
//     標頭索引。例如 System.Web.HttpWorkerRequest.HeaderContentLength。
        
//
        
//   value:
        
//     標頭的值。
        public abstract void SendKnownResponseHeader(int index, string value);
        
//
        
// 摘要:
        
//     將指定檔案的內容新增到響應並指定檔案中的起始位置和要傳送的位元組數。
        
//
        
// 引數:
        
//   handle:
        
//     要傳送的檔案的控制程式碼。
        
//
        
//   offset:
        
//     檔案中的起始位置。
        
//
        
//   length:
        
//     要傳送的位元組數。
        public abstract void SendResponseFromFile(IntPtr handle, long offset, long length);
        
//
        
// 摘要:
        
//     將指定檔案的內容新增到響應並指定檔案中的起始位置和要傳送的位元組數。
        
//
        
// 引數:
        
//   filename:
        
//     要傳送的檔案的名稱。
        
//
        
//   offset:
        
//     檔案中的起始位置。
        
//
        
//   length:
        
//     要傳送的位元組數。
        public abstract void SendResponseFromFile(string filename, long offset, long length);
        
//
        
// 摘要:
        
//     將位元組陣列中指定數目的位元組新增到響應。
        
//
        
// 引數:
        
//   data:
        
//     要傳送的位元組陣列。
        
//
        
//   length:
        
//     要傳送的位元組數(從第一個位元組開始)。
        public abstract void SendResponseFromMemory(byte[] data, int length);
        
//
        
// 摘要:
        
//     將記憶體塊中指定數目的位元組新增到響應。
        
//
        
// 引數:
        
//   data:
        
//     指向記憶體塊的非託管指標。
        
//
        
//   length:
        
//     要傳送的位元組數。
        public virtual void SendResponseFromMemory(IntPtr data, int length);
        
//
        
// 摘要:
        
//     指定響應的 HTTP 狀態程式碼和狀態說明,例如 SendStatus(200, "Ok")。
        
//
        
// 引數:
        
//   statusCode:
        
//     要傳送的狀態程式碼
        
//
        
//   statusDescription:
        
//     要傳送的狀態說明。
        public abstract void SendStatus(int statusCode, string statusDescription);
        
//
        
// 摘要:
        
//     將非標準 HTTP 標頭新增到響應。
        
//
        
// 引數:
        
//   name:
        
//     要傳送的標頭的名稱。
        
//
        
//   value:
        
//     標頭的值。
        public abstract void SendUnknownResponseHeader(string name, string value);
        
//
        
// 摘要:
        
//     在傳送所有響應資料後註冊可選通知。
        
//
        
// 引數:
        
//   callback:
        
//     在傳送所有資料(帶外)後呼叫的通知回撥。
        
//
        
//   extraData:
        
//     回撥的附加引數。
        public virtual void SetEndOfSendNotification(HttpWorkerRequest.EndOfSendNotification callback, object extraData);

        
// 摘要:
        
//     表示用於在完成傳送響應後通知呼叫方的方法。
        
//
        
// 引數:
        
//   wr:
        
//     當前的 System.Web.HttpWorkerRequest。
        
//
        
//   extraData:
        
//     處理請求所需的任何其他資料。
        public delegate void EndOfSendNotification(HttpWorkerRequest wr, object extraData);
    }

原文地址 :http://www.cnblogs.com/whtydn/archive/2009/10/16/1584418.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-616730/,如需轉載,請註明出處,否則將追究法律責任。

相關文章