国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:12:39
字體:
來源:轉載
供稿:網友
在這里我們有一個在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應用輸入的輸入輸出的抽象視角。注意這里有另一個工廠方法: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擴展的非托管操作。

,歡迎訪問網頁設計愛好者web開發。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴城市| 客服| 邻水| 伊吾县| 龙陵县| 定边县| 漯河市| 玉屏| 灌南县| 连城县| 东乡| 永康市| 垫江县| 伽师县| 庆安县| 会昌县| 安义县| 巴马| 永泰县| 措美县| 当涂县| 西安市| 沁阳市| 乌什县| 佛冈县| 达拉特旗| 陇西县| 乐清市| 阳高县| 榆树市| 长阳| 永吉县| 双峰县| 南皮县| 水城县| 沙湾县| 桐柏县| 双峰县| 昌图县| 富平县| 涟源市|