.NET Framework 中的無接觸部署,好東西啊,處理很多麻煩了,呵呵
發表時間:2023-08-14 來源:明輝站整理相關軟件相關文章人氣:
[摘要].NET Framework 中的無接觸部署 2002年7月 摘要:本文介紹一個激動人心的新功能,即使用 Web 服務器簡化 Windows 窗體智能客戶端的部署和更新。本文引用的任務管理示例應用程...
.NET Framework 中的無接觸部署
2002年7月
摘要:本文介紹一個激動人心的新功能,即使用 Web 服務器簡化 Windows 窗體智能客戶端的部署和更新。本文引用的任務管理示例應用程序可以從 Visual Basic .NET 中找到。 單擊此處打開或復制“無接觸部署”項目文件。(請注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者進行理解。)
目錄
- 簡介
- 使用 Web 服務器的無接觸部署
- 示例演示
- 窗體響應速度Windows提高
- 安全性
- 使用多程序集應用程序的無接觸部署
- 無接觸部署和 XML Web Service
- 可選:如何設置安全策略
- 客戶端要求
- 小結
簡介
您是否曾經必須部署 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 = dsDataGrid1.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.DefaultEnd 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 應用程序實現的部署和維護的優點。
有關詳細信息,請訪問
- windowsforms.net/" target=_blank>Windows 窗體社區站點(英文)
- Death of the Browser?
- Windows Forms Deployment
- Windows Forms Security
- 有關如何更好地擴展到無接觸部署的信息,請訪問 .NET Application Updater Componenth