熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

以 Cassini 來宿主 ASP. NET 客戶端

2013-11-13 10:24:44  來源: .NET編程 

  早在 月和 月發行的 MSDN Magazine 中我講述了如何構建 ASP 應用程序的客戶端環境也就是運行 ASP 網頁的無服務器環境(參見 前沿技術A Clientside Environment for ASP Pages 和 前沿技術A Clientside Environment for ASP Pages art 這些專欄的靈感源自下面的情況
  
  假設您的一個客戶需要利用一張 CD 來在線發布某些內容例如百科全書黃頁或文檔集客戶需要在 CD 內包含一個查看器應用程序和一種靈活的軟件體系結構來傳送內容另外除了有處理器最低性能和使用最新版本的 Windows 要求外客戶希望 CD 沒有什麼特殊的系統要求從而方便用戶使用這意味著最終的應用程序不應依賴於國內版本 Windows 中包括的 Microsoft Internet 信息服務 (IIS) 或個人 Web 服務器它應在純粹的無服務器的環境下離線運行
  
  在很多情況下客戶有現成的在線內容 Web 站點在其它情況下作為項目的一部分她計劃為在線內容創建 Web 站點在這種情況下利用 ASP 或 ADONET 來做這項工作是很明智的選擇因為它們非常靈活並且功能強大可使您快速有效地構建查看器應用程序但是自定義應用中果真能夠宿主 ASP 或 ADONET 嗎?
  
  大約三年前當我第一次探討這個問題時ADONET 還沒有發布只是謠傳有一種暫定被稱為 ASP+ 的東西這種東西很炫並且不久即將發行那時沒有可用來在 IIS 之外以離線方式呈現 ASP 頁的工具更糟糕的是設計 ASP 並不能輕松地完成這樣的宿主操作因此我提出一種由兩部分構成的 ASP 模擬器一種專用的浏覽器以及一個 ASP 服務器模塊構建的浏覽器用來截取任何形式的提交與 URL 請求並且將它們重定向到我自己的 ASP 服務器模塊反過來ASP 服務器將從磁盤加載資源解析其內容從而動態生成 HTML 代碼該浏覽器還負責利用與各種響應請求和服務器 ASP 對象幾乎完全相同的編程接口來實例化與初始化偽對象 概括了總體體系結構
  
 

  雖然不是理想的解決方案但它還是滿足了客戶的期待並整合成一種較大型的產品今天仍然能夠使很多專業人士使用在線和離線的內容根據從這些專欄發布起我獲得的反饋信息可以判斷出很多開發人員都面臨過類似的挑戰
  
  幾個月後Microsoft 發布了第一個 beta 版的 ADONET我思考著利用該新產品重新訪問我的解決方案ADONET 的設計是模塊化的所以很適合於宿主在外部應用中包括 IIS 自身但是能夠在自定義應用程序中宿主 ADONET 並不等於構建了一種由 CD 提供的離線 Web 浏覽器的現成解決方案在自定義應用程序中宿主 ADONET 運行庫引擎僅是離線提供動態內容的第一步如果看看圖 中所示的體系結構您就會發現它基於兩個不同的組件 — 一個還接受用戶輸入的請求處理器和一個生成實際 HTML 代碼的 ASP 源處理器宿主 ADONET 引擎只是取代了圖 中的 ASP 服務器模塊實際上您需要更多的東西 — 在理想情況下需要的是一個浏覽器和一個嵌入的 Web 服務器
  
  ADONET Cassini 示例 Web 服務器(參/Projects/Cassini/Download)是一種可以集成部署解決方案的壓縮本地 Web 服務器Cassini 采用 ADONET 宿主 API(SystemWebHosting 命名空間)來創建簡單的托管 Web 服務器套接字連接是通過 SystemNet API 來處理的可從 Microsoft 獲得 Cassini 的源代碼 顯示了基於 Cassini 的離線 Web 應用程序的典型體系結構您可以看到整個方案就像是一種基於 Internet 的典型 Web 應用程序但是更為簡單很顯然Cassini 既不是 IIS 的完全代替物也不是 Microsoft 版的開放源代碼 Web 服務器Cassini 是本地的 Web 服務器用來處理對本地文件夾的本地調用我將回顧一下 Cassini 組件然後為您說明如何在 CD 上部署 Web 站點並以此作為結束
  
 

  
  宿主 ADONET 運行庫
  ADONET 應用程序並不要求將 IIS 作為主機模塊事實上ADONET 甚至不要求用 Web 服務器來運行它公開了一個任何調用方都能使用的盡人皆知的接口連接並要求內部的 HTTP 管道處理請求
  
  宿主 ADONET 引擎時兩個類起著重要的作用 — ttpRuntime 和 ApplicationHost前者是對象的管道的入口點它更像一條裝配鏈可以將 aspx 資源的原始 HTTP 請求轉變為全新的 HTML 文本後者使得客戶端應用程序宿主 ADONET 引擎成為可能ApplicationHost 類負責創建主機進程中的 AppDomain該進程將處理新應用程序的所有傳入請求
  
  Tim Ewald 和 Keith Brown 在他們的文章HTTP Pipelines: Securely Implement Processing Filtering and Content Redirection with HTTP Pipelines in ADONET(MSDN 雜志 月刊)中全面講述了 HttpRuntime 類的內部組成只在應用程序主機收到並預處理請求時才使用 HttpRuntime 類應用程序主機將所有請求信息打包到一個請求類中該請求類派生於 HttpWorkerRequest 抽象類或更可能派生於其名為 SimpleWorkerRequest 的標准實現類在准備好使用請求類實例後主機將處理權移交給 HttpRuntime調用其 ProcessRequest 靜態方法如下列代碼所示
  
  SimpleWorkerRequest req;
  req = new SimpleWorkerRequest(aspx null ConsoleOut);
  HttpRuntimeProcessRequest(req);
  
  前面的代碼片斷顯示了啟動對 ADONET 網頁進行處理的核心代碼該代碼的執行由通過 ApplicationHost 創建的主機類的某個特殊方法來控制稍後我將回到該主題現在絕對可以說SimpleWorkerRequest 的構造函數根據 ASPX 資源的虛擬路徑進行處理采用一個可選的查詢字符串並采用文本編寫器對象作為輸出您可以使用流編寫器對象(而不是標准輸出控制台)將 HTML 代碼保存到磁盤
  
  ApplicationHost 類
  主機和 ADONET HTTP 運行庫之間的交互是由名為 ApplicationHost 的特定 Microsoft NET Framework 類來控制的從 ADONET HTTP 運行庫的角度來看主機只是調用方 — 即創建了當前的 AppDomain 並且通過調用 ProcessRequest 方法為特定的請求提供服務的模塊ADONET HTTP 運行庫和主機之間的接口都由 ApplicationHost 類的操作來完成HTTP 運行庫全然沒有調用方的特性 — 而完全是一個像 IIS 一樣的 Web 服務器一個像 Cassini 一樣的的本地 Web 服務器或者甚至就是一個片刻就可以創建的簡單應用程序ADONET 可以為調用 HttpRuntimeProcessRequest 並傳遞正確信息的任何模塊提供服務 說明了 ADONET HTTP 運行庫和其它部分的關系
  
 

  將 ADONET 宿主在應用程序中的第一步就是創建新的應用程序主機這可以通過調用 ApplicationHost 類的 CreateApplicationHost 靜態方法來完成CreateApplicationHost 在調用方進程中創建新的 AppDomain之所以需要新的 AppDomain 是因為 ADONET 要依靠一些設置這些設置只能在 AppDomain 級進行設置並且某些設置只能在創建 AppDomain 之前進行這些設置的一部分是投影復制緩存位置的應用程序基本路徑和目錄CreateApplicationHost 需要一個虛擬文件夾才能工作這意味著在第一次訪問某個新的虛擬文件夾時就會創建一個新主機並隨後創建新的 AppDomain(注意像 Cassini 這樣的簡單 Web 服務器一次只需要一個虛擬文件夾但這只是一種特殊情況
  
  在創建主機接口對象後典型的主機應用程序就開始監聽請求如果主機的工作方式與 Web 服務器的相同它就要通過端口 開始監聽傳入的消息否則它可以是您指定的任何端口然後將請求打包到請求類中並傳遞給 ADONET 運行庫
  
  HttpRuntimeProcessRequest 方法通過對象的管道路由 Request 對象在通道末端會出現一個新對象 — 就是動態創建類的一個實例該類是 Page 類的繼承類該實例表示被請求的 aspx 頁要結束該請求HTTP 運行庫要調用 Page 類的ProcessRequest 方法該頁的 ProcessRequest 方法執行 Page 對象的大量任務每項任務都以事件作為信號通過利用 runat=server 屬性集來為該頁的每個組成元素創建服務器控件實例對該頁進行首次初始化接著ADONET 代碼加載該頁的視圖狀態並將它與發送的數據(如文本框和復選框的值)合並最後運行庫執行客戶請求的任何服務器代碼(大部分為回發事件)保存視圖狀態並將 HTML 寫到輸出編寫器中
  
  CreateApplicationHost 靜態方法是 ApplicationHost 類的唯一成員它的 C# 原型如下所示
  
  public static object CreateApplicationHost(
  Type hostType
  string virtualDir
  string physicalDir
  );
  
  以上代碼片斷所示的 virtualDir 參數表示所創建的應用域的虛擬目錄而 physicalDir 參數表示此虛擬路徑後的文件系統路徑 — 被請求的 aspx 文件必須從該磁盤文件夾為該 Web 應用程序進行加載這些信息都與域相關並由 ADONET 工廠對象用來創建 HttpApplication 對象 (globalasax) 和網頁對象 (aspx)
  
  CreateApplicationHost 的第一個參數是類型對象它的賦值是應用程序定義的主機類的類型這種方法返回用戶提供的類的實例該類用來連接主機程序的默認 AppDomain 和新近創建的 AppDomain(參見圖 主機類型對象是類似服務器應用程序的核心代碼和目標 AppDomain(CreateApplicationHost 先前創建)中 ADONET HTTP 運行庫之間的一種代理
From:http://tw.wingwit.com/Article/program/net/201311/13529.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.