ASP.NET底層架構探索之再談.NET運行時(二)

來源:互聯網
上載者:User
在這裡我們有一個在ISAPI擴充中活動的,可調用的ISAPIRuntime對象的執行個體。每次運行時是啟動的並運行著的時候(譯註:相對的,如果運行時並沒有啟動,就需要象上一章所說的那樣載入運行時),ISAPI的代碼調用ISAPIRuntime.ProcessRequest()方法,這個方法是真正的進入ASP.NET管道的入口,這個流程在圖4中顯示。

  記住ISAPI是多線程的,所以請求也會通過AppDomainFactory.Create()(譯註:原文為ApplicationDomainFactory,疑有誤)函數中返回的引用在多線程環境中被處理.列表1顯示了ISAPIRuntime.ProcessRequest()方法中反編譯後的代碼,這個方法接收一個ISAPI ecb對象和服務類型(WorkerRequestType)作為參數.這個方法是安全執行緒的, 所以多個ISAPI線程可以同時在這一個被返回的對象執行個體上安全的調用這個方法。

  列表1:ProcessRequest方法接收一個ISAPI Ecb並將其傳給背景工作執行緒

public int ProcessRequest(IntPtr ecb, int iWRType)
{
 HttpWorkerRequest request1 = ISAPIWorkerRequest.CreateWorkerRequest(ecb,  iWRType);
 string text1 = request1.GetAppPathTranslated();
 string text2 = HttpRuntime.AppDomainAppPathInternal;
 if (((text2 == null) || text1.Equals(".")) ||
  (string.Compare(text1, text2, true, CultureInfo.InvariantCulture) == 0))
 {
  HttpRuntime.ProcessRequest(request1);
  return 0;
 }
 HttpRuntime.ShutdownAppDomain("Physical application path changed from " +text2 + " to " + text1);
 return 1;
}


  這裡實際的代碼並不重要, 記住這是從內部架構代碼中反編譯出來的, 你不能直接處理它, 它也有可能在將來發生改變.它只是用來揭示在幕後發生了什麼.ProcessRequest方法接收非託管的ECB引用並將它傳送給ISAPIWorkerRequest對象, 此對象負責為當前請求建立建立請求上下文.在列表2中顯示了這個過程.

  System.Web.Hosting.ISAPIWorkerRequest類是HttpWorkerRequest類的一個抽象子類(譯註:HttpWorkerRequest和ISAPIWorkerRequest都是抽象類別, 並且ISAPIWorkerRequest繼承自HttpWorkerRequest),它的工作是構建一個作為Web應用輸入的輸入輸出的抽象視角。注意這裡有另一個Factory 方法:CreateWorkerRequest, 通過判斷接受到的第二個參數來建立對應的WorkerRequest對象.有三個不同的版本:ISAPIWorkerRequestInProc,ISAPIWorkerRequestInProcForIIS6, ISAPIWorkerRequestOutOfProc.每次有請求進入,這個對象被建立並作為請求和響應對象的基礎,它會接收它們的資料和由WorkerRequest提供的資料流.

  抽象的HttpWorkerRequest類在低層介面上提供一個高層的抽象,這樣就封裝了資料是從哪裡來的,可以是一個CGI Web伺服器,Web瀏覽器控制項或者是一些你用來給HTTP運行時”喂”資料的自訂的機制.關鍵是ASP.NET能用統一的方法來接收資訊。

  在使用IIS的情況下, 這個抽象是建立在ISAPI ECB塊周圍.在我們的請求處理過程中, ISAPIWorkerRequest掛起ISAPI ECB並根據需要從它那裡取出資訊.列表2顯示了請求字串值(query string value)是如何被取出來的.

  列表2:使用非管理的資料的ISAPIWorkerRequest方法

// *** Implemented in ISAPIWorkerRequest

public override byte[] GetQueryStringRawBytes()
{
 byte[] buffer1 = new byte[this._queryStringLength];
 if (this._queryStringLength > 0)
 {
  int num1 = this.GetQueryStringRawBytesCore(buffer1, this._queryStringLength);
  if (num1 != 1)
  {
   throw new HttpException( "Cannot_get_query_string_bytes");
  }
 }
 return buffer1;
}
// *** Implemented in a specific implementation class ISAPIWorkerRequestInProcIIS6

internal override int GetQueryStringCore(int encode,StringBuilder buffer, int size)
{
 if (this._ecb == IntPtr.Zero)
 {
  return 0;
 }
 return UnsafeNativeMethods.EcbGetQueryString(this._ecb,encode,buffer,size);
}

 

  ISAPIWorkerRequest實現了一個高層次的封裝方法, 它調用了低層的核心方法, 負責真正的訪問非託管APIs-或稱為”服務等級的實現”(service level implementation).這些核心方法在特殊的ISAPIWorkerRequest子類中為它寄宿的環境提供特殊的實現, 這實現了簡單的擴充的(pluggable)環境, 這樣一來當以後新的Web伺服器介面或其他平台成為了ASP.NET的目標時附加的實作類別可以在被簡單的提供出來。這裡還有一個協助類(helper class)System.Web.UnsafeNativeMethods.裡面許多對ISAPI ECB結構的操作實現了對ISAPI擴充的非託管操作。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。