HttpRuntime的認識與加深理解

下面最先介紹HttpRuntime的Web.config裏的配置
複製代碼
<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裏節點的設置
複製代碼
<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, HttpHandler

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 處理執行。僞代碼如下:

複製代碼
public 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函數完成實際頁面請求工作,僞代碼如下:

internal static void HttpRuntime.ProcessRequestNow(HttpWorkerRequest wr)
{
   HttpRuntime._theRuntime.ProcessRequestInternal(wr);
}

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


private 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類裏面包含的方法,從其元數據裏面可以看到,如下:


public 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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章