.NET Framework 中的無(wú)接觸部署,好東西啊,處理很多麻煩了,呵呵
發(fā)表時(shí)間:2023-08-14 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要].NET Framework 中的無(wú)接觸部署 2002年7月 摘要:本文介紹一個(gè)激動(dòng)人心的新功能,即使用 Web 服務(wù)器簡(jiǎn)化 Windows 窗體智能客戶(hù)端的部署和更新。本文引用的任務(wù)管理示例應(yīng)用程...
.NET Framework 中的無(wú)接觸部署
2002年7月
摘要:本文介紹一個(gè)激動(dòng)人心的新功能,即使用 Web 服務(wù)器簡(jiǎn)化 Windows 窗體智能客戶(hù)端的部署和更新。本文引用的任務(wù)管理示例應(yīng)用程序可以從 Visual Basic .NET 中找到。 單擊此處打開(kāi)或復(fù)制“無(wú)接觸部署”項(xiàng)目文件。(請(qǐng)注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者進(jìn)行理解。)
目錄
- 簡(jiǎn)介
- 使用 Web 服務(wù)器的無(wú)接觸部署
- 示例演示
- 窗體響應(yīng)速度Windows提高
- 安全性
- 使用多程序集應(yīng)用程序的無(wú)接觸部署
- 無(wú)接觸部署和 XML Web Service
- 可選:如何設(shè)置安全策略
- 客戶(hù)端要求
- 小結(jié)
簡(jiǎn)介
您是否曾經(jīng)必須部署 Visual Basic 客戶(hù)端服務(wù)器應(yīng)用程序?或者曾經(jīng)必須部署依賴(lài)于 COM 注冊(cè)的 Win32 應(yīng)用程序?企業(yè)桌面環(huán)境中的正確安裝一直受到各種問(wèn)題的困擾,這其中既有試圖使所有用戶(hù)升級(jí)這樣的簡(jiǎn)單問(wèn)題,也有較為復(fù)雜的 DLL 版本控制問(wèn)題。
與 Web 應(yīng)用程序相比,桌面應(yīng)用程序有很多優(yōu)點(diǎn),具體表現(xiàn)在以下幾個(gè)方面:
- 豐富的用戶(hù)界面 (UI)
- 較快的響應(yīng)速度
- 較好的性能
- 能夠脫機(jī)運(yùn)行
- 可以有效地使用邊緣資源(客戶(hù)機(jī))
- 易于同本地應(yīng)用程序和 API 集成
盡管桌面應(yīng)用程序具有以上優(yōu)點(diǎn),但由于 Web 應(yīng)用程序使應(yīng)用程序的部署和更新相對(duì)容易,因此在過(guò)去幾年中得到了廣泛的應(yīng)用。
Microsoft 準(zhǔn)備通過(guò) .NET Framework 將 Web 應(yīng)用程序在部署和維護(hù)方面的所有優(yōu)點(diǎn)都集成到桌面應(yīng)用程序中。DLL 版本控制問(wèn)題也得到了解決 - 在默認(rèn)情況下,使用 .NET Framework 生成的應(yīng)用程序彼此完全孤立,并從各自的專(zhuān)用應(yīng)用程序目錄中檢索其 DLL。DLL 仍然可以在多個(gè)應(yīng)用程序之間共享,但這并非使用系統(tǒng)注冊(cè)表實(shí)現(xiàn),而是將共享的 DLL 存儲(chǔ)在 .NET Framework 全局程序集緩存中,該程序集緩存可加載給定 DLL 的多個(gè)版本并跟蹤版本與應(yīng)用程序之間的匹配關(guān)系。在實(shí)際部署應(yīng)用程序的過(guò)程中,.NET Framework 允許系統(tǒng)管理員按照部署和更新 Web 應(yīng)用程序(通過(guò)遠(yuǎn)程 Web 服務(wù)器)的方式部署應(yīng)用程序和應(yīng)用程序更新。此項(xiàng)技術(shù)稱(chēng)為無(wú)接觸部署,是本文要論述的中心內(nèi)容。
使用 Web 服務(wù)器的無(wú)接觸部署
使用無(wú)接觸部署,可以下載、安裝和直接在用戶(hù)計(jì)算機(jī)上運(yùn)行 Windows 窗體應(yīng)用程序(使用 .NET Framework 的 Windows 窗體類(lèi)生成的桌面應(yīng)用程序),而無(wú)須改變注冊(cè)表或共享的系統(tǒng)組件。
工作原理
.NET Framework 安裝提供了一個(gè)掛接 Internet Explorer 5.01 和更高版本以偵聽(tīng)所請(qǐng)求的 .NET 程序集的機(jī)制。在請(qǐng)求期間,可執(zhí)行程序被下載到磁盤(pán)上稱(chēng)為程序集下載緩存的位置。然后,名為 IEExec 的進(jìn)程在具有有限安全設(shè)置的環(huán)境中啟動(dòng)該應(yīng)用程序。
圖 1:無(wú)接觸部署方案
示例演示
這是一個(gè)非常簡(jiǎn)單的 Windows 窗體應(yīng)用程序,用戶(hù)可以使用它管理任務(wù)列表。這些任務(wù)可用于錯(cuò)誤跟蹤、IT 疑難解答,也可用于任務(wù)列表(該列表與 Outlook XP 或 Visual Studio .NET 中的列表相似)。
首先,在 Visual Studio .NET 中打開(kāi)此應(yīng)用程序。任務(wù)管理應(yīng)用程序是在 Visual Basic .NET 中使用 Windows 窗體和名為 TaskMgmtWS 的 XML Web Service(它使用 ADO.NET 與 Access 數(shù)據(jù)庫(kù)通信以存儲(chǔ)任務(wù))實(shí)現(xiàn)的。
任務(wù)管理應(yīng)用程序使用 TaskMgmtWS Web 服務(wù)更新 DataGrid Windows 控件。應(yīng)用程序首先實(shí)例化一個(gè)名為 ws 的 XML Web Service 對(duì)象。接著調(diào)用 Web 方法
GetTasks(),獲取任務(wù)的 ADO.NET 數(shù)據(jù)集。然后將任務(wù)數(shù)據(jù)集分配給 DataGrid Windows 控件中的
DataSource 屬性。
' 調(diào)用 Web 服務(wù)。Dim ws As localhost.Service1 = New localhost.Service1()Dim ds As DataSet = ws.GetTasks()' 將生成的數(shù)據(jù)集綁定到 DataGrid 控件。DataGrid1.DataSource = dsDataGrid1.DataMember = "Tasks"
應(yīng)用程序返回時(shí),DataGrid 被更新,應(yīng)用程序也將更新。此時(shí),我們遇到了在基于網(wǎng)絡(luò)的應(yīng)用程序中常見(jiàn)的問(wèn)題。第一次加載期間,應(yīng)用程序?qū)⑸梢粋(gè)網(wǎng)絡(luò)調(diào)用,可能需要幾秒鐘才能完成。
提高 Windows 窗體響應(yīng)速度
要提高應(yīng)用程序的總體響應(yīng)速度,可以利用后臺(tái)線程。已更新的應(yīng)用程序首先調(diào)用輔助線程來(lái)實(shí)例化一個(gè) XML Web Service 對(duì)象。Web 服務(wù)實(shí)例化后,我們將使用
MethodInoker() 來(lái)安全地更新 UI。
從 Form Load 事件中的輔助線程開(kāi)始:
' 使用后臺(tái)輔助線程生成 Web 服務(wù)調(diào)用,' 以提高第一次窗體加載過(guò)程中應(yīng)用程序' 的總體響應(yīng)速度。ThreadPool.QueueUserWorkItem(New WaitCallback
(AddressOf GetTasksWebServiceBackground))
有關(guān)如何在后臺(tái)線程中更新 Windows 窗體的詳細(xì)信息,請(qǐng)?jiān)L問(wèn)知識(shí)庫(kù)文章 Q318604“Populate DataGrid on Background Thread with Data Binding by Using Visual Basic .NET”,網(wǎng)址為
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q318604。
在 Windows 窗體運(yùn)行的同時(shí),編寫(xiě)一個(gè)作用于 XML Web Service 調(diào)用的后臺(tái)線程。
Private Sub GetTasksWebServiceBackground(ByVal data As Object)' 調(diào)用 Web 服務(wù)。Dim ws As localhost.Service1 = New localhost.Service1()m_ds = ws.GetTasks()' 更新 Windows 窗體數(shù)據(jù)網(wǎng)格。 Dim mi As New MethodInvoker(AddressOf UpdateDataGridForm)Dim ia As IAsyncResult = BeginInvoke(mi)Cursor = Cursors.DefaultEnd Sub
為了說(shuō)明如何將應(yīng)用程序部署到 Web 服務(wù)器上,我們將任務(wù)管理應(yīng)用程序部署到 Tasks Web Service Web 文件夾中。首先將生成文件夾更改為 TaskMgmtWS Web Service IIS 虛擬目錄。方法是打開(kāi)“TaskManagement Property Pages”(TaskManagement 屬性頁(yè))對(duì)話框,然后將輸出路徑設(shè)置為“..\TaskMgmtWS\”。
將生成結(jié)果路徑設(shè)置為 Web 服務(wù)器后,可以通過(guò)簡(jiǎn)單的重新編譯來(lái)部署此應(yīng)用程序。應(yīng)用程序生成后,我們可打開(kāi) Internet Explorer 并瀏覽到應(yīng)用程序
http://localhost/TaskMgmtWS/TaskManagement.exe。請(qǐng)注意,安裝了 .NET Framework 的 Internet Explorer 不會(huì)要求您保存該應(yīng)用程序,而是嘗試運(yùn)行該程序。如果要從 Web 頁(yè)下載應(yīng)用程序,可以使用“file://”協(xié)議處理程序。
應(yīng)用程序現(xiàn)已通過(guò) HTTP 下載并安裝到程序集下載緩存中。運(yùn)行該應(yīng)用程序之前,將檢查安全策略以確保應(yīng)用程序擁有執(zhí)行其操作的權(quán)限。
上面介紹了如何通過(guò) Web 服務(wù)器運(yùn)行該應(yīng)用程序,下面就讓我們更改該應(yīng)用程序,看看對(duì)它進(jìn)行升級(jí)有多么容易。選擇 DataGrid,可以使用 Auto Format(自動(dòng)套用格式)屬性快速更改背景樣式。
然后重新生成應(yīng)用程序,以更新 Web 服務(wù)器上的 .exe 文件。最妙的是當(dāng)用戶(hù)請(qǐng)求返回到 Windows 窗體時(shí),應(yīng)用程序代碼將自動(dòng)更新。.NET Framework 將自動(dòng)檢查程序集的時(shí)間戳,查看是需要再次下載該程序集,還是只需通過(guò)用戶(hù)的程序集下載緩存來(lái)運(yùn)行該程序集。
安全性
代碼訪問(wèn)安全性是保護(hù)桌面免受正在通過(guò)無(wú)接觸部署方式下載的 Windows 窗體應(yīng)用程序影響的關(guān)鍵。此模型通過(guò)匹配應(yīng)用程序和應(yīng)該分配給應(yīng)用程序的權(quán)限來(lái)工作。在運(yùn)行時(shí),公共語(yǔ)言運(yùn)行時(shí)從程序集中收集憑證。憑證可以采用代碼源自的 Internet Explorer 區(qū)域(本地磁盤(pán)、Intranet、Internet、受信任站點(diǎn)或不受信任站點(diǎn))的形式,也可采用代碼源自的 URL(簽名使用的私鑰、哈希值、Authenticode 發(fā)布服務(wù)器簽名等等)的形式。使用此憑證,公共語(yǔ)言運(yùn)行時(shí)將程序集分配給相應(yīng)的代碼組或類(lèi)別。每個(gè)代碼組都擁有分配給它的權(quán)限集,說(shuō)明程序集應(yīng)獲得的權(quán)限,例如能否讀取或?qū)懭氡镜卮疟P(pán)、訪問(wèn)聯(lián)網(wǎng)資源、打印以及訪問(wèn)環(huán)境變量等等。
默認(rèn)情況下,.NET Framework 附帶圍繞 Internet Explorer 區(qū)域設(shè)置的代碼組。例如,來(lái)自 Intranet 區(qū)域的代碼獲得的權(quán)限很有限,因此無(wú)法執(zhí)行文件 IO 訪問(wèn)。
為了說(shuō)明安全檢查在起作用,任務(wù)管理可執(zhí)行程序包含一個(gè)名為 Read Boot.ini 的工具欄按鈕,該按鈕嘗試訪問(wèn) C:\ 盤(pán)中的文件。
您可以進(jìn)行一個(gè)簡(jiǎn)單的測(cè)試,單擊“Read Boot.ini”按鈕,查看當(dāng)應(yīng)用程序請(qǐng)求 C:\ 根目錄中的文件時(shí)會(huì)發(fā)生什么情況 - 引發(fā)安全異常,應(yīng)用程序不處理該請(qǐng)求。
異常返回一個(gè)文件 IO 權(quán)限異常,說(shuō)明應(yīng)用程序無(wú)法訪問(wèn) TaskManagement.exe 請(qǐng)求的特定資源。
使用多程序集應(yīng)用程序的無(wú)接觸部署
在本示例應(yīng)用程序中,我們已經(jīng)說(shuō)明了如何加載單個(gè)程序集。通過(guò)對(duì)
Assemble 對(duì)象使用
LoadFrom() 方法,.NET Framework 還可以有效地將多程序集應(yīng)用程序傳入客戶(hù)端。
Assemble 類(lèi)具有
LoadFrom 方法,可以初始化一個(gè)對(duì)特定程序集的引用。
LoadFrom 的參數(shù)是 URL 或文件路徑名。指定 URL 后,.NET Framework 首先通過(guò)檢查程序集下載緩存,檢查客戶(hù)端是否存在已命名的程序集。如果程序集不在程序集下載緩存中,.NET Framework 將從 Web 服務(wù)器獲取該程序集,并將它的副本置于下載緩存中。這樣,程序集對(duì)象即可在代碼中使用。
例如,如果在一個(gè)單獨(dú)的名為 AboutForm.dll 的程序集中實(shí)現(xiàn)了 TaskManagement About Windows 窗體,則可以在用戶(hù)請(qǐng)求查看“About”(關(guān)于)對(duì)話框時(shí)使用
LoadFrom 下載該程序集。這樣,當(dāng)用戶(hù)與應(yīng)用程序交互時(shí),我們只需傳輸應(yīng)用程序所需的代碼。
無(wú)接觸部署和 XML Web Service
一個(gè)重要的安全限制是,當(dāng)通過(guò) Web 服務(wù)器分發(fā)應(yīng)用程序時(shí),其域必須與它所依賴(lài)的所有 Web 服務(wù)相匹配。例如,如果從
http://myserver/TaskManagement.exe 啟動(dòng) TaskManagement.exe,則只允許使用
http://myserver 上的 XML Web Service。出于安全性方面的考慮,不允許應(yīng)用程序從其他服務(wù)器調(diào)用 Web 服務(wù)。
可選:如何設(shè)置安全策略
計(jì)算機(jī)管理員可以更改安全權(quán)限,以便將更多權(quán)限授予現(xiàn)有代碼組或從頭開(kāi)始創(chuàng)建新代碼組。
繼續(xù)操作之前,必須明白更改安全設(shè)置是很危險(xiǎn)的,因此切勿將其關(guān)閉。強(qiáng)烈建議,在任何情況下都只更改能使應(yīng)用程序運(yùn)行的安全設(shè)置。
為此,如果您是計(jì)算機(jī)管理員,則可以運(yùn)行 CasPol 命令行工具(位于 %SystemRoot%\Microsoft.NET\Framework\v1.0.3705\CasPol.exe),為從本地主機(jī)啟動(dòng)的應(yīng)用程序授予對(duì)本地磁盤(pán)的完全訪問(wèn)權(quán)限:
caspol -machine -addgroup All_Code -url http://localhost/* FullTrust -n TaskManagement
現(xiàn)在,由于此應(yīng)用程序具有執(zhí)行文件 IO 的權(quán)限,因此能夠返回 Boot.ini 的內(nèi)容。
除了 CasPol 命令行工具以外,還通過(guò) Microsoft 管理控制臺(tái) (MMC) 管理單元提供了圖形配置工具,即 .NET Framework 配置工具。打開(kāi)管理單元后,打開(kāi)“My Computer”(我的電腦),單擊“Runtime Security Policy”(運(yùn)行時(shí)安全策略),然后依次單擊“Machine”(計(jì)算機(jī))、“Code Groups”(代碼組)和“All_Code”(所有代碼),瀏覽到 TaskManagement。使用 TaskManagement 可以查看新建的代碼組。嘗試設(shè)置新代碼組,了解由代碼訪問(wèn)安全設(shè)置所帶來(lái)的靈活性和把握度。
確保查看各選項(xiàng)后刪除在上文中創(chuàng)建的代碼組?梢酝ㄟ^(guò)運(yùn)行以下命令完成此操作:
caspol -remgroup TaskManagement
也可通過(guò) MMC 工具在 TaskManagement 上單擊右鍵并選擇 Delete(刪除)來(lái)刪除新代碼組,該工具使您能夠輕松地在代碼組之外生成 MSI 文件,如果需要,可以使用系統(tǒng)管理服務(wù)器或組策略在企業(yè)中傳播該文件。
客戶(hù)端要求
- 任何支持 .NET Framework 的操作系統(tǒng)
- 已安裝 SP1 的 .NET Framework
- Internet Explorer 5.0.1 或更高版本
- 訪問(wèn) IIS Web 服務(wù)器進(jìn)行應(yīng)用程序部署
小結(jié)
無(wú)接觸部署為分發(fā) Window 窗體應(yīng)用程序提供了非常好的方法。應(yīng)用程序開(kāi)發(fā)人員可以利用這一強(qiáng)大的桌面處理能力,同時(shí)保持由 Web 應(yīng)用程序?qū)崿F(xiàn)的部署和維護(hù)的優(yōu)點(diǎn)。
有關(guān)詳細(xì)信息,請(qǐng)?jiān)L問(wèn)
- windowsforms.net/" target=_blank>Windows 窗體社區(qū)站點(diǎn)(英文)
- Death of the Browser?
- Windows Forms Deployment
- Windows Forms Security
- 有關(guān)如何更好地?cái)U(kuò)展到無(wú)接觸部署的信息,請(qǐng)?jiān)L問(wèn) .NET Application Updater Componenth