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

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:09:38
字體:
來源:轉載
供稿:網友
  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  •   在這里我們有一個在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擴展的非托管操作。
    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 阆中市| 南木林县| 五华县| 贺州市| 台南县| 易门县| 三台县| 景宁| 黔南| 中西区| 上杭县| 喀喇沁旗| 当阳市| 洞口县| 连平县| 曲阜市| 乐都县| 墨竹工卡县| 临潭县| 龙州县| 枝江市| 巴青县| 乌兰浩特市| 莱西市| 游戏| 海安县| 灵川县| 福泉市| 霍城县| 垫江县| 山丹县| 方山县| 淮滨县| 全州县| 赣榆县| 安阳县| 乌什县| 清原| 靖边县| 稷山县| 西乌珠穆沁旗|