WPF 與XBAP應用程式(2) 之 如何佈署XBAP應用程式

文:吳俊毅
時間:2009/1/8

接續第一篇WPF 與XBAP應用程式,我們已經可以正常的在Visual Studio 2008中正常的執行WpfBrowserBrushTest這個專案,但是這樣還沒完,我們必須將它佈署至IIS上頭,這樣才能夠使一般的使用者使用一般網站一樣的在IE中開啟這個網頁。
影像 1
首先切換到專案的屬性畫面,並點選發行,表示我們將使用ClickOnce方式佈署,注意:這個動作需要以管理員身分來執行Visual Studio 2008,畫面如下:
 
請點選發行精靈按鈕,並如上圖的步驟建立一個名稱為WpfBrushTest的Web應用程式。若不是以管理員身分執行Visual Studio 2008,”本機IIS”按鈕是無法點出如圖中以結點方式顯示的本機的Web伺服器的畫面。
 影像 2
由於目前ClickOnce以內建在Visual Studio 2005/2008的專案屬性視窗內,ClickOnce為微軟推出,一套簡化許多安裝程序的一套安裝程式的Framework,有興趣的讀者可以參考筆者另一篇ClickOnce的文章!我們先走完我們的流程吧。

上面的動作很迅速的在IIS裡幫我們建立出一個應用程式,由於筆者使用Vista,Vista內建的是IIS 7的版本,如果讀者使用的Windows 2003或Windows XP等畫面可能會有些不太一樣,如下,筆者打開IIS 7看見並可點開WpfBrushTest站台
 影像 3
接著請讀者切換到內容檢視畫面,IIS 6或IIS 5.5不需要做此動作,然後在WfpBrowserBrushText.xbap按滑鼠右鍵點選瀏覽,表示直接執行這個應用程式,這時候IE上頭會顯示 未受與信任,如下:
影像 4
如果點選開啟錯誤按鈕可以看見如下的詳細錯誤:
錯誤詳細資料
執行此作業時,偵測到下列錯誤。
* [2009/1/10 下午 11:05:15] System.Deployment.Application.TrustNotGrantedException (未知的子類型)
- 使用者拒絕將執行所需的權限授與此應用程式。
- 來源: System.Deployment
- 堆疊追蹤:
於 System.Deployment.Application.ApplicationTrust.RequestTrust(SubscriptionState subState, Boolean isShellVisible, Boolean isUpdate, ActivationContext actCtx, TrustManagerContext tmc)
於 System.Deployment.Application.DeploymentManager.DetermineTrustCore(Boolean blocking, TrustParams tp)
於 System.Deployment.Application.DeploymentManager.DetermineTrust(TrustParams trustParams)
於 System.Deployment.Application.InPlaceHostingManager.AssertApplicationRequirements(Boolean grantApplicationTrust)
於 System.Deployment.Application.InPlaceHostingManager.AssertApplicationRequirements()
於 MS.Internal.AppModel.XappLauncherApp.AssertApplicationRequirementsAsync(Object unused)
* [2009/1/10 下午 11:05:15] System.Deployment.Application.DeploymentException (未知的子類型)
- AssertApplicationRequirements 方法失敗。無法認可應用程式。
- 來源: System.Deployment
- 堆疊追蹤:
於 System.Deployment.Application.DeploymentManager.WaitForAssertApplicationRequirements()
於 System.Deployment.Application.DeploymentManager.SynchronizeCore(Boolean blocking)
於 System.Deployment.Application.DeploymentManager.SynchronizeAsyncWorker()
我們得到的Exception是TrustNotGrantedException,為什麼呢,因為XBAP可以由Web Server下載至Client端的IE並且執行,所以它的安全性要求當然是非常的高的,眼尖的讀者會發現,上一篇文章中,在屬性的安全性頁籤中可以選擇這是部分信任的應用程式,且可以選需要什麼權限,EnvironmentPermission, FileDialogPermission, FilIOPermission等,嚴格上來說,這隻XBAP應用程式因為會存取Windows目錄下的圖片檔案,所以應該只會使用到FileIOPermission,但因為之前就已經是對ClickOnce做完全信任,也就是Full Trust Application,所以我們就照目前的設定往下做吧,只要讀者了解就好。

現在如果要讓Click端直接信任這個XBAP的應用程式就必須在要執行這個XBAP程式的Client端電腦匯入這個憑證,當然,在企業內入部網路執行時我們可以利用Windows的Server Group Policy工具來自動的完成這個動作,但因筆者家裡並未有此Server Group環境,所以就假設是Internet環境中USER必須以手動匯入方式,在Windows 2003中可直接由系統管理工具點選憑證,Vista或Windows XP可能要使用mmc管理工具自行加入一個憑證的嵌入式管理單元。
影像 5
為了使程式能夠正常的執行我們必須將程式的WpfBrowserBrushTest_TemporaryKey.pfx臨時憑證匯入到”信任的根憑證授權”與”受信任的發行者中”,首先在”信任的根憑證授權”下的憑證以右鍵點選匯入,如下視窗:
影像 6
如圖瀏覽到專案資料夾並匯入WpfBrowserBrushTest_TemporaryKey.pfx,匯入過程中提示會設定憑證的安全密碼保留空白即可,因為該憑證是由本機電腦所產生,不是由標準憑證發行組織所發行的,所以到後面會有一個警告訊息按確認即可,然後請對受信任的發行者進行相同的匯入動作。

匯入完成之後,如點選憑證可以看見我們的憑證已經安裝在裡面了,如下圖所示:
影像 7
這時候在執行一次WpfBrowserBrushTest.xbap應該就可以正確的執行了。如下圖,程式是由local的IIS直接執行此XBAP應用程式:
影像 8
完成了這個步驟後有些讀者也許會好奇XBAP應用程式是如何下載執行的,其實是透過Visual Studio 幫我們產生的WpfBrowserBrushTest.exe.deploy檔案與應用程式資訊清單WpfBrowserBrushTest.exe.manifest,就在ClickOnce的佈署路徑下的Application Files下面,而一旦Client端執行過這個XBAP應用程式之後該程式就會被下載到ClickOnce的App Cache中,如果要清除掉ClickOnce App Cache可以執行如下命令:
Mage -cc

若沒有安裝Windows SDK的環境還有一招終極的方式,就是透過rundll32.exe來呼叫dfshim.dll的一個function,命令如下
rundll32 %windir%\system32\dfshim.dll CleanOnlineAppCache

一樣可以達到相同的效果!棒吧,對於ClickOnce有興趣的讀者可以參考筆者關於ClickOnce的文章,XBAP安全性這部分就說明到這裡啦~嘿嘿

留言

這個網誌中的熱門文章

軟體工程師 - 成長的 10 個階段

常見的程式碼壞味道(Code Smell or Bad Smell)

什麼是 gRPC ?