欧美日韩精品在线,国内精品久久久久久久久,一级毛片恃级毛片直播,清纯唯美亚洲综合欧美色

實(shí)現(xiàn).NET應(yīng)用程序的自動(dòng)更新_.Net教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:Asp.Net使用POST方法最簡單的實(shí)現(xiàn)
Asp.Net 2.0 中實(shí)現(xiàn)了IButtonControl接口的控件都有一個(gè)PostBackUrl屬性,可以進(jìn)行跨頁面提交,就是用的POST方法。那么在1.x中費(fèi)了一番周折的POST提交就很簡單了,只要把PostBackUrl設(shè)置為提交

應(yīng)用程序更新的方法一般有兩種:一是通知用戶(比如發(fā)E-mail),讓用戶到指定的網(wǎng)站地址下載更新的程序;二是將更新的職責(zé)從用戶那邊轉(zhuǎn)移到應(yīng)用程序自身,由應(yīng)用程序自身取代用戶獲取并安裝一個(gè)軟件的更新,客戶端應(yīng)用程序自身負(fù)責(zé)從一個(gè)已知服務(wù)器下載并安裝更新,用戶唯一需要進(jìn)行干預(yù)的是決定是否愿意現(xiàn)在或以后安裝新的更新。顯然,后者比前者更友好。你現(xiàn)在可以看到類似后一種方法的實(shí)際產(chǎn)品,比如Windows XP和Microsoft Money。本文所介紹的.NET應(yīng)用程序更新組件就可以提供類似的功能。

一、.NET應(yīng)用程序更新組件介紹

.NET 應(yīng)用程序更新組件AppUpdater 是使用.NET框架開發(fā)的。盡管AppUpdater 不是微軟的產(chǎn)品,但是只要你在VS.NET工具欄中添加了該組件,就可以象使用其它組件一樣通過拖拽的方式將該組件從工具欄中拖放到你的應(yīng)用程序中,并設(shè)置一些屬性(比如獲取更新的位置、頻率等)之后就可以使得你的客戶端應(yīng)用程序具備自動(dòng)更新的功能。

二、工作原理

要深入理解.NET客戶端應(yīng)用程序更新組件的工作原理,需要仔細(xì)研究一下實(shí)現(xiàn)客戶端應(yīng)用程序更新有那些必須要做的事情。第一步需要做的是檢查是否有更新;當(dāng)發(fā)現(xiàn)有更新時(shí),開始第二步工作——下載更新;當(dāng)更新下載完成時(shí),進(jìn)行是最后一步的工作——實(shí)現(xiàn)更新。

(一) 為更新做檢查

作為開發(fā)者,首先你得告訴應(yīng)用程序到什么地方去做更新檢查,否則它豈不是要大海撈針?其次,確定何時(shí)做更新檢查。不可能用戶每次一運(yùn)行客戶端程序,而它就在后臺(tái)不停的進(jìn)行更新檢查,那多浪費(fèi)資源!最后還有一項(xiàng)重要的事情需要解決,那就是如何進(jìn)行更新檢查。.NET應(yīng)用程序更新組件使用HTTP進(jìn)行通訊,這就允許客戶端應(yīng)用程序穿透防火墻來進(jìn)行更新。并且進(jìn)行更新檢查所需要的地址就成了已知的Web服務(wù)器的一個(gè)URL地址,第一個(gè)問題順利解決。

.NET應(yīng)用程序更新組件在組件生成的基礎(chǔ)上產(chǎn)生一個(gè)線程,該線程負(fù)責(zé)進(jìn)行更新檢查。該線程在大多數(shù)時(shí)間處于休眠狀態(tài),但會(huì)在設(shè)置好的間隔蘇醒并實(shí)現(xiàn)一次更新檢查。應(yīng)用程序?yàn)樾碌母滤龅臋z查的頻率依賴于各應(yīng)用自身。進(jìn)行更新檢查的間隔常用值的范圍一般是從一個(gè)小時(shí)到幾天。這種輪詢的基本方法并不適合于所有情況。比如Microsoft Money只是在用戶讓它去進(jìn)行更新檢查時(shí)它才去檢查。在這種情況下,更新輪詢線程可被禁用。

通過用命令調(diào)用更新組件的CheckForUpdate()方法來實(shí)現(xiàn)更新檢查。

關(guān)于如何進(jìn)行更新檢查的方法有這樣幾種:

方法一:直接文件檢查——使用HTTP來比較服務(wù)器和客戶端應(yīng)用程序的最后的修改日期/時(shí)間戳是否一致。如果服務(wù)器上有更新的文件,客戶端就知道可以更新自己了。對(duì)于Web瀏覽器來講,也是同樣的道理,它知道是否需要重新下載一個(gè)html頁面或圖片或是否可以重復(fù)使用先前已下載的。當(dāng)應(yīng)用程序有一個(gè)新的版本可用時(shí),管理員簡單地拷貝一個(gè)更新的版本來覆蓋Web服務(wù)器上的舊版本。這種方法的問題在于更新不是自動(dòng)進(jìn)行,由此會(huì)出現(xiàn)潛在的失敗可能。比如,如果管理員正在更新Web服務(wù)器上的應(yīng)用程序版本,同時(shí)有個(gè)客戶正在下載更新之前的版本,那么這個(gè)客戶的計(jì)算機(jī)上就會(huì)既存在更新之前的一些文件,也存在更新之后新版本的一些文件。基于上述原因,對(duì)于重要的應(yīng)用程序不提倡使用直接文件檢查來更新。

方法二:顯式檢查——在服務(wù)器上使用一個(gè)顯式的配置文件。一個(gè)可和.NET應(yīng)用程序更新組件使用的有效服務(wù)器顯式文件大致是這個(gè)樣子:

<VersionConfig>
<AvailableVersion>1.0.0.0</AvailableVersion>
<ApplicationUrl>http://localhost/demos/selfupdate/V1/</
ApplicationUrl>
</VersionConfig>

AvailableVersion指定最新的可用程序集的版本號(hào)。ApplicationURL屬性指定該版本應(yīng)用程序所在的URL地址。當(dāng)管理員想要更新客戶端應(yīng)用程序時(shí),他們就會(huì)將應(yīng)用程序的新版本拷貝到Web服務(wù)器上并且適當(dāng)?shù)匦薷姆⻊?wù)器顯式文件。客戶端自身會(huì)探測到服務(wù)器顯式文件已被修改,然后下載顯式文件。客戶端隨后比較顯式文件中指定的程序集版本號(hào)與應(yīng)用程序EXE文件的版本號(hào)。如果服務(wù)器顯式文件中的可用版本號(hào)較新,應(yīng)用程序就知道需要更新了。這種方法對(duì)大多數(shù)應(yīng)用程序而言是推薦使用的方法。

方法三:XML Web Service 檢查——XML WebServices提供一種更高級(jí)的更新檢查方式。比如,假定你希望在進(jìn)行更新你的其他用戶之前先對(duì)一系列早期用戶進(jìn)行更新,如果客戶端應(yīng)用程序調(diào)用一個(gè)XML WebService來檢查一項(xiàng)更新是否可用,那個(gè)XML Web Service還可以在數(shù)據(jù)庫中查詢該用戶并判斷該用戶是否是早期用戶。如果他們是早期用戶,XML Web Service就返回一個(gè)值表示更新可用。如果不是,Web Service就返回一個(gè)值表示更新不可用。但本文介紹的.NET應(yīng)用程序更新組件并不提供直接的XML Web Service支持。

要采用XML Web Service來進(jìn)行更新檢查,首先建立 XML Web Service并掛鉤一個(gè)OnCheckForUpdate事件。這樣就允許你自己的自定義檢查代替輪詢者線程更新檢查。OnCheckForUpdate事件有一個(gè)返回值,該值表示更新是否被檢測到。

(二) 下載更新

當(dāng).NET應(yīng)用程序更新組件檢測到一項(xiàng)新的更新可用時(shí)它會(huì)自動(dòng)啟動(dòng)另一個(gè)線程并開始異步后臺(tái)下載更新。

下載使用HTTP-DAV來完成。DAV 是一種擴(kuò)展的HTTP,.. 它提供諸如目錄和文件枚舉這樣的功能。一項(xiàng)完整的下載過程始于指定一個(gè)URL。采用URL來下載依賴于完成更新檢查所使用的方式。比如,如果使用服務(wù)器顯式文件,下載更新所用的URL通過在服務(wù)器顯式文件 中的ApplicationURL屬性指定。

更新下載顯然需要一定的健壯性。在下載和更新之后讓客戶端應(yīng)用程序處于任何不穩(wěn)定的狀態(tài)是不可接受的。下載過程中任何問題可能都會(huì)出現(xiàn):更新文件所屬的Web 服務(wù)器可能會(huì)宕機(jī),客戶端機(jī)器可能會(huì)崩潰,或者因?yàn)槟撤N原因用戶只是簡單的關(guān)閉了應(yīng)用程序。由于應(yīng)用程序正在進(jìn)行下載,如果它被關(guān)閉的話,下載將會(huì)停止。一種可選的設(shè)計(jì)方案是使用單獨(dú)的系統(tǒng)服務(wù)來進(jìn)行應(yīng)用程序的下載和更新。使用系統(tǒng)服務(wù),即便應(yīng)用程序自身沒有在運(yùn)行,更新下載也會(huì)繼續(xù)。實(shí)際上,Windows XP就有一種稱之為BITS的內(nèi)建的下載服務(wù),其目的即在此。BITS是Windows XP用來對(duì)Windows自身進(jìn)行下載更新的。想查看更多關(guān)于BITS的信息,請(qǐng)參閱http://msdn.microsoft.com/library/en-us/dnwxp/html/WinXP_BITS.asp。在.NET應(yīng)用程序更新組件中沒有使用這種服務(wù),因此它可以在不支持系統(tǒng)服務(wù)的Windows 9x中使用。

(三) 實(shí)現(xiàn)更新

.NET應(yīng)用程序更新組件通過將下載和更新過程分為單獨(dú)的兩個(gè)階段來獲得健壯性。當(dāng)每一階段都完成時(shí),在位于客戶端應(yīng)用程序目錄下的一個(gè)更新顯式文件(manifest file)中記載下來。如果下載或更新任何一個(gè)階段中的過程被打斷,它就會(huì)在下一次應(yīng)用程序啟動(dòng)時(shí)從上一次完成的斷點(diǎn)繼續(xù)原來的工作。每一階段都可以重新運(yùn)行,因此如果在一個(gè)階段中間出現(xiàn)失敗,重新運(yùn)行該階段就可以成功。如果有錯(cuò)誤發(fā)生,比如在下載過程中與服務(wù)器的鏈接丟失,.NET更新組件將會(huì)在稍后重試。如果報(bào)告了非常多的錯(cuò)誤(例如web服務(wù)器再也沒有回到在線狀態(tài)),下載和更新將會(huì)被放棄并且報(bào)告出錯(cuò)誤。

我們的第一個(gè)方法是簡單地啟動(dòng)一個(gè)單獨(dú)的進(jìn)程來實(shí)現(xiàn)更新。這個(gè)單獨(dú)的進(jìn)程將會(huì)首先關(guān)閉應(yīng)用程序進(jìn)程,實(shí)現(xiàn)更新(因?yàn)檫@時(shí)候已被解鎖),重啟應(yīng)用程序進(jìn)程并且在完成之后關(guān)閉自己。因此,這種設(shè)計(jì)存在三個(gè)基本的問題:

. 在某些情況下它不起作用。在更新應(yīng)用程序時(shí),更新進(jìn)程關(guān)閉原始的應(yīng)用程序進(jìn)程,更新進(jìn)程自身也要被關(guān)閉,因此也就不會(huì)實(shí)現(xiàn)更新。

. 我們希望能夠自動(dòng)更新所有要實(shí)現(xiàn)更新的代碼。我們希望自動(dòng)安裝修補(bǔ)的能力不僅僅發(fā)生在應(yīng)用程序上,而且.NET應(yīng)用程序更新組件自身也可以。使用這種模式,我們不能更新實(shí)現(xiàn)更新的進(jìn)程。

. 強(qiáng)制用戶關(guān)閉應(yīng)用程序并在使用過程中等待,這是很不禮貌的。

用來實(shí)現(xiàn)應(yīng)用程序更新的最后一種方法是使用.NET框架并行程序集模式。作為試圖更新應(yīng)用程序自身的替代方案,生成一個(gè)比目前存在版本新的應(yīng)用程序版本。

新版本可以通過合并目前現(xiàn)存的應(yīng)用程序目錄與下載的更新版本來生成。當(dāng)新版本完成時(shí),用戶在下次重新打開應(yīng)用程序時(shí)會(huì)自動(dòng)使用新版本。原始應(yīng)用程序的拷貝就可以被移除了。棘手問題是弄清在某個(gè)指定時(shí)刻哪個(gè)版本該被載入。我們介紹一個(gè)名稱為Appstart的應(yīng)用程序。

Appstart是進(jìn)入你應(yīng)用程序的入口點(diǎn),使用這種模式,你的應(yīng)用程序目錄看起來是這個(gè)樣子:

--> Program Files

--> MyApp

--> Appstart.exe

--> Appstart.config

--> V1 Folder

--> MyApp.exe

--> V1.1 Folder

--> MyApp.exe

要運(yùn)行你的應(yīng)用程序,你通常是啟動(dòng)Appstart.exe。如果你想在桌面上有個(gè)快捷鍵,那個(gè)快捷鍵必須應(yīng)該指向Appstart而不是直接指向應(yīng)用程序(注意,你可以重命名AppStart.exe 為任何你想要的名字,例如YourApp.exe)Appstart.exe是個(gè)非常簡單的程序,它讀取Appstart.config文件并且載入指定的應(yīng)用程序。一個(gè)有效Appstart.config文件如下所示:

<Config>
 <AppFolderName>V1 Folder</AppFolderName>
 <AppExeName>MyApp.exe</AppExeName>
 <AppLaunchMode>appdomain</AppLaunchMode>
</Config>

AppFolderName指定包含當(dāng)前要運(yùn)行的應(yīng)用程序版本的子文件夾。AppExeName包含在那個(gè)文件夾下要載入的exe文件名。當(dāng)一個(gè)應(yīng)用程序更新完成時(shí),最后一步就是修改AppFolderName的值為指向應(yīng)用程序的新版本。這樣,下次用戶運(yùn)行應(yīng)用程序時(shí),就會(huì)運(yùn)行新的應(yīng)用程序更新后的版本。AppLaunchMode指定如何加載應(yīng)用程序。有兩種方式加載應(yīng)用程序:第一種方式是使用AppDomains。AppDomains是.NET框架公用語言運(yùn)行時(shí)的特性,也是獨(dú)立的邏輯單元和管理對(duì)象。公用語言運(yùn)行時(shí)允許每個(gè)進(jìn)程中存在多個(gè)應(yīng)用程序域。這樣Appstart.exe就能夠在單獨(dú)的AppDomain中同時(shí)卻是相同的AppStart.exe進(jìn)程中加載你的應(yīng)用程序。盡管事實(shí)是兩個(gè)不同的exe 程序在運(yùn)行(即Appstart.exe和MyApp.exe),但只有一個(gè)進(jìn)程在使用。對(duì)于大多數(shù)應(yīng)用程序AppDomains會(huì)工作得很好,當(dāng)然,在一個(gè)單獨(dú)的AppDomain中運(yùn)行和在一個(gè)單獨(dú)的進(jìn)程中運(yùn)行還是有些細(xì)微區(qū)別的。在這種情況下,AppLaunchMode可以設(shè)置為“process”,這樣就會(huì)使應(yīng)用程序在單獨(dú)進(jìn)程中加載。

一旦Appstart啟動(dòng)應(yīng)用程序,它就會(huì)進(jìn)入休眠狀態(tài)等待應(yīng)用程序終止。一旦應(yīng)用程序終止,Appstart也會(huì)關(guān)閉。

三、實(shí)例演練

前面我們討論了.NET應(yīng)用程序更新是如何工作的,現(xiàn)在我們來將它應(yīng)用在實(shí)例中。

第一步:建立應(yīng)用程序來進(jìn)行更新

1、使用VS.NET生成一個(gè)新的Windows應(yīng)用項(xiàng)目,命名為"SampleApp"。

2、給窗體一個(gè)你選擇的有趣的背景色。我們將使用背景色來與后面更新的版本區(qū)別。

3、現(xiàn)在讓我們給這個(gè)應(yīng)用程序增加一個(gè)細(xì)微的功能,首先給你的窗體增加一個(gè)按鈕。壓縮文件中包含一個(gè)擁有簡單Windows窗體的程序集。給壓縮文件中Samples\SampleApp\SimpleForm 程序集增加一個(gè)引用。然后在你的按鈕事件句柄中添加兩行代碼:

..
SimpleForm.Form1 F = new SimpleForm.Form1();
F.Show();

4、將你的build標(biāo)志從debug轉(zhuǎn)換為RELEASE。這將允許我們避免稍后當(dāng)我們生成一個(gè)應(yīng)用程序的新版本而同時(shí)原始拷貝正在運(yùn)行產(chǎn)生的pdb文件鎖定問題。生成并測試你的應(yīng)用程序。

第二步:添加.NET應(yīng)用程序更新組件

1、在VS.NET工具欄的組件標(biāo)簽上,右擊選擇“自定義工具欄”。選擇“.NET框架組件”標(biāo)簽。點(diǎn)“瀏覽”并選擇位于壓縮文件中AppUpdater 項(xiàng)目下的AppUpdater.dll,單擊OK。

2、一個(gè)AppUpdater圖標(biāo)現(xiàn)在應(yīng)該出現(xiàn)在工具欄的組件列表的底部。將AppUpdater 組件拖放到SampleApp窗體上。一個(gè)名為appUpdater1的.NET應(yīng)用程序更新組件的實(shí)例會(huì)出現(xiàn)在窗體的底部。

第三步:設(shè)置.NET應(yīng)用程序更新組件

在這一步我們將設(shè)置.NET應(yīng)用程序更新組件。注意這個(gè)示例你只需改變最開始的四個(gè)屬性,其它的采用默認(rèn)值。

AppUpdater屬性:這是.NET Application應(yīng)用程序更新的核心,對(duì)于本程序需要做以下設(shè)置:

(1)AutoFileLoad:這個(gè)控制后面要描述的命令下載特征,現(xiàn)在將它設(shè)置為true。

(2)ChangeDetectionMode:該枚舉決定如何為更新進(jìn)行檢查。在該例中,我們將使用一個(gè)服務(wù)器顯式檢查,因此將這個(gè)值設(shè)置為“ServerManifestCheck ”。

(3)ShowDefaultUI: .NET 應(yīng)用程序更新組件具有一系列用戶界面來通知用戶一些事件,比如有一個(gè)新的更新可以使用了或者在更新期間發(fā)生錯(cuò)誤等。這種用戶界面可以通過設(shè)置默認(rèn)的用戶界面為無效而用自定義應(yīng)用程序指定的用戶界面來代替它,掛鉤適當(dāng)?shù)氖录ū热鏞nUpdateComplete)并彈出自定義用戶界面。對(duì)于該例我們將使用默認(rèn)的用戶界面,因此將這個(gè)值設(shè)置為true 。

(4)UpdateUrl :UpdateUrl 是決定更新程序到何處去尋找更新的。在該例中我們使用一個(gè)服務(wù)器顯式文件來檢查更新,因此這個(gè)屬性應(yīng)當(dāng)設(shè)置為服務(wù)器顯式文件的URL。

在該例中將它設(shè)置為:http://yourWebserver/SampleApp_ServerSetup/UpdateVersion.xml。請(qǐng)用你的Web 服務(wù)器名稱來代替“yourWebserver ”。

Downloader 屬性:AppUpdater 組件有兩個(gè)子組件。第一個(gè)稱之為Downloader,它控制組件的下載和Poller屬性:AppUpdater的第二個(gè)子組件是Poller,Poller控制更新檢查。

(1)AutoStart:布爾值,在應(yīng)用程序啟動(dòng)時(shí)控制Poller 是否應(yīng)當(dāng)開始輪詢或它是否應(yīng)當(dāng)?shù)却钡接杏?jì)劃的更新查詢開始。

(2)DownloadOnDetection:布爾值,控制Poller 在一個(gè)新的更新發(fā)現(xiàn)時(shí)是否立即開始下載更新,或者是否通過調(diào)用DownloadUdpate() 方法開始顯式下載。

(3)InitialPollInterval:應(yīng)用程序啟動(dòng)后在第一次執(zhí)行更新檢查前等待的秒數(shù)。

(4)PollInterval:第一次更新檢查之后,PollInterval 控制后續(xù)每次更新檢查之間間隔的秒數(shù),注意:默認(rèn)為每30 秒進(jìn)行一次檢查;顯然,你會(huì)希望你的應(yīng)用程序減少更新檢查的頻率。

所有這一切完成之后,你的屬性表格看起來應(yīng)當(dāng)是下面這個(gè)樣子:

Samples\SampleApp\SampleApp_Complete目錄包含應(yīng)用程序正確安裝的一個(gè)版本。

安裝:

(1)DownloadRetryAttempts:在下載期間如果有錯(cuò)誤發(fā)生(比如Web 服務(wù)器宕機(jī))downloader 會(huì)稍后重試。這個(gè)屬性控制downloader 認(rèn)為是徹底的應(yīng)用程序更新錯(cuò)誤之前重試網(wǎng)絡(luò)請(qǐng)求的次數(shù)。

(2)SecondsBeteweenDownloadRety:重試網(wǎng)絡(luò)請(qǐng)求之前等待的秒數(shù)。

(3)UpdateRetryAttempts: 在更新期間如果發(fā)生嚴(yán)重錯(cuò)誤,(例如downloader 超過了試圖重試的次數(shù)),就會(huì)產(chǎn)生一個(gè)應(yīng)用程序更新錯(cuò)誤。默認(rèn)的,將會(huì)停止試圖更新。但是在應(yīng)用程序下一次啟動(dòng)時(shí)會(huì)試圖恢復(fù)(比如更新Web 服務(wù)器可能會(huì)宕機(jī)好幾天)。這個(gè)屬性控制試圖更新的次數(shù)。如果超過這個(gè)值,updater 就會(huì)取消更新,重置它的狀態(tài)并返回更新檢查。

(4)ValidateAssemblies: 這個(gè)屬性控制下載程序集有效完成的級(jí)別。更多信息參見這篇文章的安全一節(jié)。

第四步:生成并在客戶端部署應(yīng)用程序V1版本。

在SampleApp項(xiàng)目中,打開AssemblyInfo.cs文件。將AssemblyVersion的值從“1.0”修改為“1.0.0.0”。這會(huì)引起在生成程序集時(shí)獲得值為“1.0.0.0”.. 的標(biāo)記,該標(biāo)記代替VS.NET通常指定為遞增的值。

1、生成應(yīng)用程序。

2、從壓縮文件中將Samples\SampleApp\SampleApp_ClientSetup目錄拷貝到你的本地機(jī)器上。要注意此目錄已經(jīng)包含了AppStart.exe。AppStart.config已經(jīng)設(shè)置為指向1.0.0.0目錄并且啟動(dòng)SampleApp.exe。

從SampleApp的release目錄下拷貝SampleApp(Appupdater.dll,SimpleForm.dll和SampleApp.exe)

到客戶端SampleApp_ClientSetup\1.0.0.0目錄下。至此,一個(gè)功能完整的應(yīng)用程序版本已被“安裝”到了客戶端,可以通過運(yùn)行AppStart.exe來執(zhí)行。

第五步:安裝Web服務(wù)器

在這一步我們將安裝Web服務(wù)器以提供更新輪詢功能。.NET應(yīng)用程序更新組件使用HTTP-DAV來下載應(yīng)用程序更新,因此需要一個(gè)支持HTTP-DAV的Web服務(wù)器。Windows 2000上的IIS5.0和更新的操作系統(tǒng)都支持HTTP-DAV。

1、將Samples/SampleApp_ServerSetup目錄拷貝到你的Web服務(wù)器上的wwwroot目錄下。

2、將SampleApp的V1版本拷貝到Web服務(wù)器的1.0.0.0文件夾。

3、在Web服務(wù)器上為SampleApp_ServerSetup目錄啟用IIS的“目錄瀏覽”權(quán)限。

第六步:自動(dòng)更新應(yīng)用程序

OK,.. 現(xiàn)在是時(shí)間來通過自動(dòng)安裝一個(gè)新版本來看看以上這些艱苦工作的結(jié)果了。

1、如果你部署在客戶端的SampleApp版本沒有運(yùn)行,加載它讓它運(yùn)行,記得使用AppStart.exe。

2、回到VS.NET并在SampleApp窗體中做一些可以被注意到的修改(比如修改背景色)。

3、將AssemblyInfo.cs的版本信息改為2.0.0.0。

4、重新生成。

5、回到Web服務(wù)器并生成一個(gè)和1.0.0.0目錄同等的目錄2.0.0.0。從release生成目錄下將新版本應(yīng)用程序拷貝到Web服務(wù)器上新建的2.0.0.0目錄下。

6、打開UpdateVersion.xml 并修改AvailableVersion為2.0.0.0。修改ApplicationURL為指向新的2.0.0.0路徑。

7、保存對(duì)UpdateVersion.xml所做的修改。

一旦你保存了新的UpdateVersion.xml,在30秒之內(nèi),運(yùn)行中的SampleApp拷貝將會(huì)探測到新的可用版本。

四、按需安裝、安全、可擴(kuò)展性及調(diào)試

(一)按需求安裝

所謂按需求安裝,指只有主可執(zhí)行程序被顯式安裝到客戶機(jī)上。應(yīng)用程序剩下的部分可以根據(jù)基本需要自動(dòng)下載和安裝。

通過.NET應(yīng)用程序更新組件的AutoFileLoad屬性來啟動(dòng)按需求安裝。你必須仔細(xì)考慮在你的應(yīng)用程序中程序集邊界所處的位置以及什么動(dòng)作會(huì)引起程序集被下載。由于程序集的下載涉及到網(wǎng)絡(luò)輸入輸出,因此下載所花費(fèi)的時(shí)間是可變的。在程序集下載期間,應(yīng)用程序會(huì)被凍結(jié)等待程序集下載完成。

(二)部署安全

自動(dòng)安裝應(yīng)用程序更新的能力具備很多好處,但它也伴隨著一些潛在的危險(xiǎn)。當(dāng)你使得安裝更新變得簡單時(shí),如果不小心,你也可能使得安裝惡意代碼變得簡單。有兩種危險(xiǎn),第一種危險(xiǎn)是有人會(huì)用自己的Web服務(wù)器欺騙用來部署更新的Web服務(wù)器。他們可能會(huì)利用那臺(tái)Web服務(wù)器在你的應(yīng)用程序路徑安裝一個(gè)病毒程序。阻止欺騙或其它通過網(wǎng)絡(luò)進(jìn)行的不正當(dāng)干預(yù)的最簡單的方法是使用HTTPS。要和.NET應(yīng)用程序更新組件一起使用HTTPS,可以簡單地用HTTPS URLs來代替HTTP URLs。當(dāng)然,HTTPS 不是銀彈。使用HTTPS有兩個(gè)問題,第一是可伸縮性。使用HTTPS需要服務(wù)器加密所有從Web服務(wù)器上下載的文件。如果一個(gè)應(yīng)用程序的更新文件很大,加密更新文件的代價(jià)會(huì)使服務(wù)器的負(fù)擔(dān)過重。使用HTTPS的另一個(gè)問題是它對(duì)第二種安全危險(xiǎn)毫無益處。第二種危險(xiǎn)是黑客既可能從內(nèi)部也可能從外部來攻擊你的服務(wù)器。一旦攻擊成功,則有可能意味著成百上千的客戶端也通過自動(dòng)更新遭受連累,這種情況將是災(zāi)難性的。

為解決這個(gè)問題,.NET應(yīng)用程序更新組件使用給.NET程序集添加強(qiáng)名稱的特性來驗(yàn)證所下載的程序集。如果.NET應(yīng)用程序更新組件檢測到下載期間一個(gè)程序集不是使用你的密鑰簽名的,下載就會(huì)取消。這意味著只有擁有你的應(yīng)用程序私鑰的人才能夠建立可自動(dòng)部署的更新文件。

要驗(yàn)證程序集有效,.NET應(yīng)用程序更新組件驗(yàn)證你當(dāng)前安裝的應(yīng)用程序可執(zhí)行程序的公鑰和下載的更新的公鑰是否匹配。如果兩個(gè)程序集以相同且保密的私鑰簽名,那么嵌入的公鑰也就相同。因?yàn)楸籆LR加載的程序集為了驗(yàn)證它的公鑰,CLR計(jì)算它正常的哈希值檢查來保證程序集實(shí)際上就是真正的程序集而不是被做了手腳的程序集。為了能夠在下載時(shí)驗(yàn)證,可以給你所有的應(yīng)用程序集添加強(qiáng)名稱并將.NET應(yīng)用程序更新組件的ValidateAssemblies屬性設(shè)置為true。

在下載時(shí)進(jìn)行程序集驗(yàn)證會(huì)起很大的作用,但實(shí)際上,應(yīng)用程序會(huì)經(jīng)常有不同私鑰簽名的組件。比如,你的應(yīng)用程序可能有兩個(gè)文件:使用你的私鑰簽名的可執(zhí)行程序集和另一個(gè)包含你購買的應(yīng)用在你的應(yīng)用程序中的第三方圖表控件的dll程序集。第三方程序集可能使用第三方而不是你自己的私鑰來簽名。使情況變得更為復(fù)雜的是,在你的應(yīng)用程序中用來簽名程序集的有效私鑰的設(shè)置隨著版本號(hào)的改變可能會(huì)發(fā)生變化。你該如何自動(dòng)更新那些應(yīng)用的類型?為解決這個(gè)問題,你可以在你的應(yīng)用程序中生成一個(gè)包含有效公鑰的列表的程序集。將該程序集使用應(yīng)用程序的主私鑰(應(yīng)用程序的exe文件簽名的密鑰)簽名并把該程序集放到Web服務(wù)器上和應(yīng)用程序更新文件一起的目錄下。在更新下載過程開始之前,.NET應(yīng)用程序更新組件將會(huì)檢查Web服務(wù)器上應(yīng)用程序更新目錄下一個(gè)名為"AppUpdaterKeys.dll"的的程序集。如果存在,該程序集就會(huì)被下載。該程序集會(huì)被拿來和主應(yīng)用程序的公鑰對(duì)比驗(yàn)證。如果簽名有效,密鑰列表會(huì)被提取出來。從此之后,任何處于該列表中的密鑰會(huì)被認(rèn)為是更新文件的有效簽名。

有關(guān)安全方面推薦的方法是使用HTTPS URLs來實(shí)現(xiàn)更新檢查。這會(huì)提供第一級(jí)別的欺騙保護(hù)。對(duì)于更新下載,最好不要使用HTTPS RLs以避免使你Web服務(wù)器的負(fù)荷過重。而是給你的應(yīng)用程序的程序集添加強(qiáng)名稱并使用程序集驗(yàn)證特性。

(三)可擴(kuò)展性

在這篇文章前面講過的示例中我們簡單地通過拖放一個(gè)組件到應(yīng)用程序中并設(shè)置一些屬性來實(shí)現(xiàn)自動(dòng)部署。

雖然這在許多應(yīng)用程序中工作的很好,但在一些應(yīng)用程序中會(huì)需要高級(jí)別的控制,這只能通過寫代碼來獲得。我們可以編寫自己的代碼來替換掉.NET應(yīng)用程序更新組件標(biāo)準(zhǔn)過程,使用重寫的CheckForUpdate()和ApplyUpdate()方法來定制檢查和更新行為。

(四)調(diào)試

這一節(jié)將指出一些首選的調(diào)試選項(xiàng),以及描述使用該組件的用戶大多數(shù)常見的問題。

.NET應(yīng)用程序更新器在和AppStart.exe相同的目錄下生成一個(gè)名為AppUpdate.log的隱藏日志文件。

所有的更新成功和失敗信息都記錄在該日志中。當(dāng)有一個(gè)特殊的客戶端不能成功更新時(shí)日志文件會(huì)特別有用。

你可以使用日志來判斷在什么時(shí)間以及是如何更新失敗的。另外,.NET應(yīng)用程序更新組件使用.NET框架的Debug類來輸出大量有用的信息。如果你在調(diào)試器中運(yùn)行你的應(yīng)用程序,你會(huì)在輸出窗口中看到這些信息。你可以循著.NET應(yīng)用程序更新器的記錄重點(diǎn)觀察并找到出問題的地方。

如果由于某種原因,你無法使得.NET應(yīng)用程序更新器工作,在你深入調(diào)試之前請(qǐng)確定以下幾點(diǎn),你遇到的問題很可能就是如下之一:

. 你是否將IIS目錄瀏覽給打開了?如果沒有,更新器將不會(huì)下載安裝任何文件。

. 你是否正確的部署了一切并正確設(shè)置了URL?

. 如果你的應(yīng)用程序安裝在program files目錄下,確定你是該機(jī)的超級(jí)管理員或超級(jí)用戶嗎?如果不是,你將不會(huì)有寫權(quán)限來更新應(yīng)用程序。

. 你是在應(yīng)用程序的主用戶界面線程中生成AppUpdater對(duì)象的嗎?如果不是,更新器將不能顯示用戶界面并且在激發(fā)事件回到用戶界面時(shí)失敗。

. 是否更新成功,但應(yīng)用程序使用新的更新自動(dòng)重啟時(shí)失敗?.NET 應(yīng)用程序更新組件試圖通過調(diào)用Application.Exit方法來退出應(yīng)用程序。然而,該方法并不能保證關(guān)閉一個(gè)應(yīng)用程序。如果你生成并遺留了單獨(dú)的線程在運(yùn)行,該方法就無法關(guān)閉進(jìn)程。保證所有線程終止的解決的方案是通過調(diào)用Application.OnExit事件,或者掛鉤.NET應(yīng)用程序更新器的OnUpdateComplete事件并自己處理關(guān)閉。

五、總結(jié)

客戶端應(yīng)用程序部署方便是.NET框架第一個(gè)版本的重要的目標(biāo)。用.NET框架建立解決部署問題的客戶端應(yīng)用程序是一種很好的技術(shù)。部署方便仍然是未來.NET框架新版本的一個(gè)重要目標(biāo)。就方案而言,這里描述的.NET應(yīng)用程序更新組件代表了我們的一些想法,在未來版本的.NET框架中我們將可以直接使用。然而,在那個(gè)時(shí)候到來之前的這段期間,.NET應(yīng)用程序更新組件不失為開始建立自動(dòng)更新應(yīng)用程序的一種重要的方法。

分享:ASP.NET:設(shè)置頁面buffer引出來的問題
前幾天,在程序使用Respoonse.Redirect("a.aspx?f=9#12")的時(shí)候,發(fā)現(xiàn)在IE里面,跳轉(zhuǎn)之后的頁面忽略了#之后的內(nèi)容,奇怪的是在同一頁面向自己Redirect的時(shí)候,這個(gè)問題就不會(huì)存在,百

來源:模板無憂//所屬分類:.Net教程/更新時(shí)間:2008-08-22
相關(guān).Net教程