將用戶端登陸介面的公司資料放在CompanyData.xml中儲存,在smartclient/clickonce的部署模式下,直接將該xml檔案從服務端下載至用戶端,這個思路解決了在系統登入前訪問服務端資料的需要,又避免了在用戶端將部分資料hardcode的問題。
但是在clickonce下,用戶端安裝完成後,發現CompanyData.xml檔案不見了。我檢查了manifest檔案,用mageui開啟,可以看到該檔案確實在裡面。其中一個細節是,CompanyData.xml是被作為Data file而存在的。
最開始以為是xml檔案的下載出現了問題,以為就像config檔案的下載被Request Filtering過濾掉了的問題一樣,企圖通過在ClientPublish的web.config中增加一行:<remove fileExtension=".xml" />來解決這個問題,這個問題沒有定位清楚,這麼做肯定是不行的。這源於一個發現,我在用戶端的本機使用者目錄查詢,按照Shell.exe.config來查詢,查到了兩個結果,如:
smartclient在被安裝到使用者本地臨時目錄時,怎麼會存到兩個地方呢?各自開啟對應的目錄一看,恍然大悟。
路徑1:
路徑2:
路徑2下的兩個檔案引起了我的注意,這說明CompanyData.xml檔案已經被下載到用戶端了,只是沒有被拷貝到program file folder。那麼這顯然就與IIS的配置無關了,純粹是clickonce的Application Files的配置問題了。開啟MSDN上關於Application Files Dialog的主題,原來Data file不會被自動安裝到program file folder,只有Include類型才會預設將當前檔案拷貝到program file folder中。就理解而言,CompanyData.xml確實是Data file,但是我又希望它能夠被安裝到program file folder中,怎麼辦?在這裡我採用的是折中的辦法,將CompanyData.xml的類型改為Include(而Data file如何拷貝到program file folder的方向我沒有深入進去),有了這樣的思路,那麼就好辦了。
開啟Shell項目屬性,進入Publish頁,點擊Application files按鈕,可以看到Shell項目中所有檔案的資源清單,找到CompanyData.xml,將其publish status由Data file改為Include,然後儲存,比較一下Shell.csproj的變化,發現多了很多東西,例如:
<ItemGroup> <IsWebBootstrapper>false</IsWebBootstrapper> <PublishUrl>publish\</PublishUrl> <Install>true</Install> <InstallFrom>Disk</InstallFrom> <UpdateEnabled>false</UpdateEnabled> <UpdateMode>Foreground</UpdateMode> <UpdateInterval>7</UpdateInterval> <UpdateIntervalUnits>Days</UpdateIntervalUnits> <UpdatePeriodically>false</UpdatePeriodically> <UpdateRequired>false</UpdateRequired> <MapFileExtensions>true</MapFileExtensions> <ApplicationRevision>0</ApplicationRevision> <ApplicationVersion>1.0.0.%2a</ApplicationVersion> <UseApplicationTrust>false</UseApplicationTrust> <BootstrapperEnabled>true</BootstrapperEnabled><ItemGroup />
其中,多了一段重要的一個ItemGroup:
<ItemGroup> <PublishFile Include="CompanyData.xml"> <Visible>False</Visible> <Group> </Group> <TargetPath> </TargetPath> <PublishState>Include</PublishState> <IncludeHash>True</IncludeHash> <FileType>File</FileType> </PublishFile></ItemGroup>
出于謹慎的考慮(因為之前在搞clickonce的時候,Shell項目的publish配置調整,引出了不少問題),所以我只將上面的這個ItemGroup加了進去,其它不相關的忽略不問。(感覺這也是visual studio project的一個問題,當修改了publish頁的配置,專案檔中增加了很多不必要的東西)
加上去之後,趕緊將代碼提交到SVN,在jenkins中kick一個新的build,登入test server執行client publish,然後到test client上將之前安裝的Shell(多個版本)刪除,然後重新安裝,一試,果真OK,CompanyData.xml已經可以按照設想被拷貝到program file folder中了。剛做完,趕緊將這個過程分享出來。:)