|
為了讓你的智能應用程序運轉(zhuǎn),你需要改變一些客戶端的安全設置,實質(zhì)上就是通知客戶端運行時間相信你的應用程序。一種方法就是將帶有你的程序集的站點添加到IE中可信任站點清單中,然后用安裝在你的管理工具目錄下的Microsoft .NET Framework Configuration工具來修改.NET Framework安全設置。打開Framework Configuration工具,選擇運行庫安全策略,然后選擇調(diào)整安全區(qū)域。對于受信任站點中指定的所有站點,將信任級別調(diào)整到完全信任。作為選擇,你也可以用Framework Configuaration工具來修改安全策略,使它信任你的應用程序的個別程序集。右擊運行庫安全策略,選擇提高程序集的信任級別。 另一個可選擇的方法就是用代碼組,用Framework Configuration工具來幫助你提高應用系統(tǒng)的程序集的安全設置。你需要讓所有運用你的應用程序的桌面用戶做這種改變。為了幫助完成該任務,F(xiàn)ramework Configuration工具可以創(chuàng)建一個包含安全策略的Microsoft Installer (MSI)部署包。MSI安裝了應用程序加載器來分布你的應用程序需要的安全策略和加載器裝配。右擊運行庫安全策略,選擇創(chuàng)建部署包。 在網(wǎng)絡運行中,自動更新是依靠IE的緩存機制來完成的。即當您需要下載并運行一個應用程序時,IE將向Web服務器發(fā)送一個HTTP請求,該請求將獲取服務器上該程序的最新更新日期,如果該日期大于本地緩存的程序的日期或者本地緩存中不存在該程序,則從服務器上下載,否則直接使用本地緩存的程序。因此對于.net本身所具有的版本機制而言,不能作為版本更新的依據(jù),只有在某個程序集文件引用另外一個程序集時,才會由.net運行時依據(jù)自身的版本機制判斷版本號。 注意事項: ¨ 這種運行方式通常需要在運行前先設置用戶的安全策略。 ¨ 加載應用組件時,需要一個完整的url地址。 ¨ 如果應用程序集中需要調(diào)用Web Service,該Web Service所在的服務器地址只能是最初下載程序集的服務器,可以構(gòu)造一個重定向來解決該問題。 ¨ 某些文件可能不能通過自動更新機制來完成版本更新,如:.Config應用程序的配置文件。 ¨ 如果某些應用程序集文件的版本之間存在著某些關(guān)聯(lián)性,則在某些情況下(如:網(wǎng)絡突然中斷)可能會出 三、創(chuàng)建程序
客戶端應用程序的執(zhí)行步驟: 1、 登錄系統(tǒng)。通過輸入用戶名和密碼或其他任何方式進行系統(tǒng)登錄,通常需要一個登錄窗體。(該步操作需要客戶端應用程序在線執(zhí)行,因此可以考慮在窗體上提供一個離線工作的按鈕,然后直接使用上次在線登錄時服務器傳遞的配置文件副本。這樣做會引發(fā)一些安全性問題和客戶端數(shù)據(jù)和服務器數(shù)據(jù)同步的問題。) 2、 由應用服務器驗證通過以后,根據(jù)系統(tǒng)設定的用戶權(quán)限獲取用戶可以加載的應用組件及其相應的配置信息,同時從數(shù)據(jù)庫中獲取用戶的個性化配置信息,將這些配置信息組合成一個XML配置文件流傳遞給客戶端應用程序。該步操作通常由一個Web服務調(diào)用來執(zhí)行。 3、 客戶端程序解析該配置文件流,根據(jù)個性化配置信息設置主窗體樣式,根據(jù)應用組件配置信息加載相應的程序集文件。保存該配置文件以備離線工作時使用。 4、 (本地運行方式)啟動后臺更新線程,該線程定時搜索更新服務器上是否有最新版本的程序,如果有則自動下載,并提示用戶更新程序。 5、 用戶通過點擊相應的應用組件的按鈕或菜單,在客戶端主窗體中將顯示應用組件自身攜帶的用戶界面。 客戶端應用程序基本包含了登錄窗體、主窗體和應用組件加載器。加載器內(nèi)有一個應用組件集合類,同時還提供一些方法用于主程序和應用組件之間以及不同應用組件之間的通訊,某些應用組件是作為公共組件為其他應用提供數(shù)據(jù),因此應該通過統(tǒng)一的方法來獲取數(shù)據(jù)。 注意事項和建議: 1、對于網(wǎng)絡運行方式,程序集在動態(tài)加載的過程從服務器被下載到本地緩存中,而本地運行方式的下載過程由更新組件執(zhí)行,加載過程則客戶端主窗體執(zhí)行。 在.net中動態(tài)加載程序集的方法: using System.Reflection; //網(wǎng)絡運行方式,加載的程序集路徑為服務器上的url地址 assemblyFileName = "http://SmartClient/AppComponent1.dll"; //本地運行方式,加載的程序集路徑為本地的目錄路徑 assemblyFileName = @"c:\SmartClient\AppComponent1.dll"; Assembly asm = Assembly.LoadFrom(assemblyFileName); 2、客戶端應用程序的主窗體作為應用組件的容器,可以通過兩種方法來顯示應用組件的用戶界面: 第一種方式是將客戶端應用程序設計為多文檔界面(MDI)應用程序,每個應用組件都包含有各自的啟動主窗體,客戶端應用程序執(zhí)行每個應用組件時,將構(gòu)造并顯示該組件的啟動窗體類型。MDI 應用程序中常有包含子菜單的“窗口”菜單項,用于在主窗口或應用之間進行切換。 另一種方式是在客戶端應用程序的主窗體界面中預留一塊應用界面區(qū)域,而每個應用組件作為一個用戶控件在執(zhí)行時被添加到應用界面區(qū)域的控件數(shù)組中。應用界面區(qū)域通常是一個面板(Pane)控件,通過更改用戶控件的Z順序在各個應用之間進行切換(Control. BringToFront())。 3、在客戶端應用程序根據(jù)配置信息加載相應的應用組件時,同時需要在客戶端主窗體的工具欄或菜單上創(chuàng)建對應的按鈕和菜單項,并添加事件以便于用戶操作??蛻舳藨贸绦蚝蛻媒M件之間應盡量保持獨立性,減少關(guān)聯(lián),以體現(xiàn)客戶端應用程序結(jié)構(gòu)清晰和簡單??梢酝ㄟ^.net中的回調(diào)(事件委托)等方法實現(xiàn)這一點。 使用此方法時需要注意,如果您構(gòu)造的類型實例包含一個帶參數(shù)的構(gòu)造函數(shù),則這些參數(shù)對象必須是可跨應用程序域訪問的對象,即是可序列化的對象??梢酝ㄟ^繼承MarshalByRefObject對象或使用[Serializable]特性標記類,同時設置遠程對象的生存期策略。 示例:(省略) 四、發(fā)布程序 1、在發(fā)布和更新服務器上設置一個虛擬目錄(如:SmartClient)將應用組件的所有文件放置在相應的目錄下。 虛擬目錄的設置屬性中必須包括:讀取和目錄瀏覽權(quán)限,執(zhí)行許可為純腳本。 對于本地運行方式,需要根據(jù)客戶端應用程序的版本號設置多個目錄,每個目錄存放不同版本的所有文件。(也可以在新版本目錄下只存放更新了的文件,但需要修改更新組件。當用戶更新版本時,必須下載大于當前版本的所有新版本目錄下的文件,以防止某些情況下會出現(xiàn)某個版本的文件被遺漏的問題)。 在本地運行方式中,還需要在根目錄下維護一個更新版本清單文件,因為它允許用戶以老版本客戶端應用程序登錄。 2、發(fā)布一個Web Service。該Web服務主要完成以下任務: ¨ 執(zhí)行客戶端用戶的身份驗證 ¨ 從整個應用系統(tǒng)的安全模塊中獲取該用戶允許執(zhí)行的應用組件的清單,包含應用組件的位置、文件名稱和應用組件本身所需的配置信息。(在本地運行方式下,該清單還和版本有關(guān)) ¨ 從數(shù)據(jù)庫中獲取該用戶的個性化配置信息,和上一步獲取的信息合并為一個XML文件流。 ¨ 將該配置文件流作為返回參數(shù)返回給客戶端應用程序。 3、將客戶端應用程序放置在虛擬根目錄下作為應用組件程序集的加載器,同時在企業(yè)內(nèi)部網(wǎng)站上增加一個指向客戶端應用程序的鏈接。對于網(wǎng)絡運行方式,還將提供一個安全策略部署包(MSI)文件的鏈接。 用戶第一次運行時的執(zhí)行步驟 網(wǎng)絡運行方式: ¨ 下載并安裝安全策略部署包 ¨ 通過點擊客戶端應用程序的鏈接,下載并執(zhí)行客戶端應用程序 ¨ 將該鏈接添加到收藏夾中或建立桌面快捷方式,以便于運行 本地運行方式: ¨ 不直接點擊客戶端應用程序的鏈接,將此鏈接另存到用戶選擇的目錄下 ¨ 在資源管理器中執(zhí)行客戶端應用程序 ¨ 在桌面上建立可執(zhí)行文件的快捷方式,以便于運行 五、更新程序 網(wǎng)絡運行方式的更新步驟較為簡單,只須將更新了的文件直接覆蓋老文件即可。其缺點是某些程序集附帶的引用文件不能自動下載新版本,只有清空客戶端的IE緩存后才能實現(xiàn)更新。 本地運行方式的更新步驟如下: ¨ 在服務器虛擬根目錄下新建一個以新版本號命名的目錄,增量更新只需將更新了的文件復制到該目錄下,否則需要將所有文件都復制到目錄。 ¨ 修改保存所有版本清單的文件,并指明當前活動的最新版本號,用于和客戶端進行版本比較。 六、擴展應用組件 為了實現(xiàn)企業(yè)應用系統(tǒng)的可擴展性,通過接口定義,可以使應用開發(fā)商通過實現(xiàn)這些接口將自己的應用組件方便的添加到客戶端應用程序中。以下介紹一些接口中主要包含的方法和屬性。 1、 應用組件名稱屬性:用于標明該應用組件功能的注釋性文本。 2、 應用組件在客戶端應用程序上的各個界面元素屬性:指客戶端應用程序上的工具欄、菜單欄、下拉菜單項和列表框等用于標志該應用組件的控件上,需要應用組件提供的文本、圖片、圖標、菜單、事件處理方法等。 3、 初始化方法:在客戶端應用程序加載應用組件時,首先執(zhí)行的方法。在加載應用組件時,對于由服務器傳來的配置文件中包含的各個應用組件自身的配置信息,客戶端應用程序并不解析,而是將該配置信息在初始化應用組件時作為參數(shù)傳遞給應用組件,增加了靈活性。 4、 獲取應用組件加載器方法:獲取應用組件加載器后,可以通過其中包含的公共方法獲取一些應用所需的共享數(shù)據(jù)。 5、 獲取應用組件啟動控件的方法:啟動控件可以是窗體或用戶控件。 6、 關(guān)閉應用組件的方法(可選):當客戶端應用程序被關(guān)閉時,執(zhí)行該方法。應用組件本身根據(jù)自身情況決定是否可以立即關(guān)閉,同時立即釋放組件所占用的系統(tǒng)資源。對于MDI應用程序,可以在啟動窗體的關(guān)閉事件中處理而不需要該方法。 客戶端應用程序內(nèi)的應用組件加載器可以通過枚舉組件程序集內(nèi)的類型來判斷該組件是否符合借口定義。同時可以將多個應用組件打包在一個應用程序集中。此過程非常耗時。 示例:(省略) 小結(jié) 上述僅僅是對創(chuàng)建智能客戶端應用程序作了簡單的描述和示范,并對其中可能遇到的問題給與了必要的解釋,希望能對您創(chuàng)建更為強大、靈活、便捷的應用程序提供幫助。 |
|
|