.NET Framework 中的無接觸部署,好東西啊,解決很多麻煩了,呵呵

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- .NET Framework 中的無接觸部署,好東西啊,解決很多麻煩了,呵呵 (http://www.webasp.net/article/5/4273.htm)
-- 作者:未知
-- 發佈日期: 2003-07-12
.NET Framework 中的無接觸部署
2002年7月

摘要:本文介紹一個激動人心的新功能,即使用 Web 服務器簡化 Windows 窗體智能客戶端的部署和更新。本文引用的任務管理示例應用程序可以從 Visual Basic .NET 中找到。 單擊此處打開或複製「無接觸部署」項目文件。(請注意,在示例文件中,程序員的註釋使用的是英文,本文中將其譯為中文是為了便於讀者進行理解。)

目錄

簡介


您是否曾經必須部署 Visual Basic 客戶端服務器應用程序?或者曾經必須部署依賴於 COM 註冊的 Win32 應用程序?企業桌面環境中的正確安裝一直受到各種問題的困擾,這其中既有試圖使所有用戶升級這樣的簡單問題,也有較為複雜的 DLL 版本控制問題。
與 Web 應用程序相比,桌面應用程序有很多優點,具體表現在以下幾個方面:
  • 豐富的用戶界面 (UI)
  • 較快的響應速度
  • 較好的性能
  • 能夠脫機運行
  • 可以有效地使用邊緣資源(客戶機)
  • 易於同本地應用程序和 API 集成

儘管桌面應用程序具有以上優點,但由於 Web 應用程序使應用程序的部署和更新相對容易,因此在過去幾年中得到了廣泛的應用。
Microsoft 準備通過 .NET Framework 將 Web 應用程序在部署和維護方面的所有優點都集成到桌面應用程序中。DLL 版本控制問題也得到了解決 - 在默認情況下,使用 .NET Framework 生成的應用程序彼此完全孤立,並從各自的專用應用程序目錄中檢索其 DLL。DLL 仍然可以在多個應用程序之間共享,但這並非使用系統註冊表實現,而是將共享的 DLL 存儲在 .NET Framework 全局程序集緩存中,該程序集緩存可加載給定 DLL 的多個版本並跟蹤版本與應用程序之間的匹配關係。在實際部署應用程序的過程中,.NET Framework 允許系統管理員按照部署和更新 Web 應用程序(通過遠程 Web 服務器)的方式部署應用程序和應用程序更新。此項技術稱為無接觸部署,是本文要論述的中心內容。

使用 Web 服務器的無接觸部署


使用無接觸部署,可以下載、安裝和直接在用戶計算機上運行 Windows 窗體應用程序(使用 .NET Framework 的 Windows 窗體類生成的桌面應用程序),而無須改變註冊表或共享的系統組件。

工作原理


.NET Framework 安裝提供了一個掛接 Internet Explorer 5.01 和更高版本以偵聽所請求的 .NET 程序集的機制。在請求期間,可執行程序被下載到磁盤上稱為程序集下載緩存的位置。然後,名為 IEExec 的進程在具有有限安全設置的環境中啟動該應用程序。

圖 1:無接觸部署方案

示例演示


這是一個非常簡單的 Windows 窗體應用程序,用戶可以使用它管理任務列表。這些任務可用於錯誤跟蹤、IT 疑難解答,也可用於任務列表(該列表與 Outlook XP 或 Visual Studio .NET 中的列表相似)。
首先,在 Visual Studio .NET 中打開此應用程序。任務管理應用程序是在 Visual Basic .NET 中使用 Windows 窗體和名為 TaskMgmtWS 的 XML Web Service(它使用 ADO.NET 與 Access 數據庫通信以存儲任務)實現的。
任務管理應用程序使用 TaskMgmtWS Web 服務更新 DataGrid Windows 控件。應用程序首先實例化一個名為 ws 的 XML Web Service 對象。接著調用 Web 方法 GetTasks(),獲取任務的 ADO.NET 數據集。然後將任務數據集分配給 DataGrid Windows 控件中的 DataSource 屬性。
        ' 調用 Web 服務。        Dim ws As localhost.Service1 = New localhost.Service1()        Dim ds As DataSet = ws.GetTasks()                ' 將生成的數據集綁定到 DataGrid 控件。        DataGrid1.DataSource = ds        DataGrid1.DataMember = "Tasks"

應用程序返回時,DataGrid 被更新,應用程序也將更新。此時,我們遇到了在基於網絡的應用程序中常見的問題。第一次加載期間,應用程序將生成一個網絡調用,可能需要幾秒鐘才能完成。

提高 Windows 窗體響應速度


要提高應用程序的總體響應速度,可以利用後台線程。已更新的應用程序首先調用輔助線程來實例化一個 XML Web Service 對象。Web 服務實例化後,我們將使用 MethodInoker() 來安全地更新 UI。
從 Form Load 事件中的輔助線程開始:
        ' 使用後台輔助線程生成 Web 服務調用,        ' 以提高第一次窗體加載過程中應用程序        ' 的總體響應速度。        ThreadPool.QueueUserWorkItem(New WaitCallback
(AddressOf GetTasksWebServiceBackground))

有關如何在後台線程中更新 Windows 窗體的詳細信息,請訪問知識庫文章 Q318604「Populate DataGrid on Background Thread with Data Binding by Using Visual Basic .NET」,網址為 http://support.microsoft.com/default.aspx?scid=kb;en-us;Q318604
在 Windows 窗體運行的同時,編寫一個作用於 XML Web Service 調用的後台線程。
    Private Sub GetTasksWebServiceBackground(ByVal data As Object)        ' 調用 Web 服務。        Dim ws As localhost.Service1 = New localhost.Service1()        m_ds = ws.GetTasks()        ' 更新 Windows 窗體數據網格。                     Dim mi As New MethodInvoker(AddressOf UpdateDataGridForm)        Dim ia As IAsyncResult = BeginInvoke(mi)        Cursor = Cursors.Default    End Sub

為了說明如何將應用程序部署到 Web 服務器上,我們將任務管理應用程序部署到 Tasks Web Service Web 文件夾中。首先將生成文件夾更改為 TaskMgmtWS Web Service IIS 虛擬目錄。方法是打開「TaskManagement Property Pages」(TaskManagement 屬性頁)對話框,然後將輸出路徑設置為「..\TaskMgmtWS\」。
將生成結果路徑設置為 Web 服務器後,可以通過簡單的重新編譯來部署此應用程序。應用程序生成後,我們可打開 Internet Explorer 並瀏覽到應用程序 http://localhost/TaskMgmtWS/TaskManagement.exe。請注意,安裝了 .NET Framework 的 Internet Explorer 不會要求您保存該應用程序,而是嘗試運行該程序。如果要從 Web 頁下載應用程序,可以使用「file://」協議處理程序。
應用程序現已通過 HTTP 下載並安裝到程序集下載緩存中。運行該應用程序之前,將檢查安全策略以確保應用程序擁有執行其操作的權限。
上面介紹了如何通過 Web 服務器運行該應用程序,下面就讓我們更改該應用程序,看看對它進行升級有多麼容易。選擇 DataGrid,可以使用 Auto Format(自動套用格式)屬性快速更改背景樣式。
然後重新生成應用程序,以更新 Web 服務器上的 .exe 文件。最妙的是當用戶請求返回到 Windows 窗體時,應用程序代碼將自動更新。.NET Framework 將自動檢查程序集的時間戳,查看是需要再次下載該程序集,還是只需通過用戶的程序集下載緩存來運行該程序集。

安全性


代碼訪問安全性是保護桌面免受正在通過無接觸部署方式下載的 Windows 窗體應用程序影響的關鍵。此模型通過匹配應用程序和應該分配給應用程序的權限來工作。在運行時,公共語言運行時從程序集中收集憑證。憑證可以採用代碼源自的 Internet Explorer 區域(本地磁盤、Intranet、Internet、受信任站點或不受信任站點)的形式,也可採用代碼源自的 URL(簽名使用的私鑰、哈希值、Authenticode 發佈服務器簽名等等)的形式。使用此憑證,公共語言運行時將程序集分配給相應的代碼組或類別。每個代碼組都擁有分配給它的權限集,說明程序集應獲得的權限,例如能否讀取或寫入本地磁盤、訪問聯網資源、打印以及訪問環境變量等等。
默認情況下,.NET Framework 附帶圍繞 Internet Explorer 區域設置的代碼組。例如,來自 Intranet 區域的代碼獲得的權限很有限,因此無法執行文件 IO 訪問。
為了說明安全檢查在起作用,任務管理可執行程序包含一個名為 Read Boot.ini 的工具欄按鈕,該按鈕嘗試訪問 C:\ 盤中的文件。
您可以進行一個簡單的測試,單擊「Read Boot.ini」按鈕,查看當應用程序請求 C:\ 根目錄中的文件時會發生什麼情況 - 引發安全異常,應用程序不處理該請求。
異常返回一個文件 IO 權限異常,說明應用程序無法訪問 TaskManagement.exe 請求的特定資源。

使用多程序集應用程序的無接觸部署


在本示例應用程序中,我們已經說明了如何加載單個程序集。通過對 Assemble 對像使用 LoadFrom() 方法,.NET Framework 還可以有效地將多程序集應用程序傳入客戶端。
Assemble 類具有 LoadFrom 方法,可以初始化一個對特定程序集的引用。LoadFrom 的參數是 URL 或文件路徑名。指定 URL 後,.NET Framework 首先通過檢查程序集下載緩存,檢查客戶端是否存在已命名的程序集。如果程序集不在程序集下載緩存中,.NET Framework 將從 Web 服務器獲取該程序集,並將它的副本置於下載緩存中。這樣,程序集對像即可在代碼中使用。
例如,如果在一個單獨的名為 AboutForm.dll 的程序集中實現了 TaskManagement About Windows 窗體,則可以在用戶請求查看「About」(關於)對話框時使用 LoadFrom 下載該程序集。這樣,當用戶與應用程序交互時,我們只需傳輸應用程序所需的代碼。

無接觸部署和 XML Web Service


一個重要的安全限制是,當通過 Web 服務器分發應用程序時,其域必須與它所依賴的所有 Web 服務相匹配。例如,如果從 http://myserver/TaskManagement.exe 啟動 TaskManagement.exe,則只允許使用 http://myserver 上的 XML Web Service。出於安全性方面的考慮,不允許應用程序從其他服務器調用 Web 服務。

可選:如何設置安全策略


計算機管理員可以更改安全權限,以便將更多權限授予現有代碼組或從頭開始創建新代碼組。
繼續操作之前,必須明白更改安全設置是很危險的,因此切勿將其關閉。強烈建議,在任何情況下都只更改能使應用程序運行的安全設置。
為此,如果您是計算機管理員,則可以運行 CasPol 命令行工具(位於 %SystemRoot%\Microsoft.NET\Framework\v1.0.3705\CasPol.exe),為從本地主機啟動的應用程序授予對本地磁盤的完全訪問權限:
caspol -machine -addgroup All_Code -url http://localhost/* FullTrust -n TaskManagement

現在,由於此應用程序具有執行文件 IO 的權限,因此能夠返回 Boot.ini 的內容。
除了 CasPol 命令行工具以外,還通過 Microsoft 管理控制台 (MMC) 管理單元提供了圖形配置工具,即 .NET Framework 配置工具。打開管理單元後,打開「My Computer」(我的電腦),單擊「Runtime Security Policy」(運行時安全策略),然後依次單擊「Machine」(計算機)、「Code Groups」(代碼組)和「All_Code」(所有代碼),瀏覽到 TaskManagement。使用 TaskManagement 可以查看新建的代碼組。嘗試設置新代碼組,瞭解由代碼訪問安全設置所帶來的靈活性和把握度。
確保查看各選項後刪除在上文中創建的代碼組。可以通過運行以下命令完成此操作:
caspol -remgroup TaskManagement

也可通過 MMC 工具在 TaskManagement 上單擊右鍵並選擇 Delete(刪除)來刪除新代碼組,該工具使您能夠輕鬆地在代碼組之外生成 MSI 文件,如果需要,可以使用系統管理服務器或組策略在企業中傳播該文件。

客戶端要求

  • 任何支持 .NET Framework 的操作系統
  • 已安裝 SP1 的 .NET Framework
  • Internet Explorer 5.0.1 或更高版本
  • 訪問 IIS Web 服務器進行應用程序部署

小結


無接觸部署為分發 Window 窗體應用程序提供了非常好的方法。應用程序開發人員可以利用這一強大的桌面處理能力,同時保持由 Web 應用程序實現的部署和維護的優點。

有關詳細信息,請訪問

  • Windows 窗體社區站點(英文)
  • Death of the Browser?
  • Windows Forms Deployment
  • Windows Forms Security
  • 有關如何更好地擴展到無接觸部署的信息,請訪問 .NET Application Updater Componenth

webasp.net