Silverlight技術研討:WebClient, 檔案下載利器

iDotNetSpace發表於2010-03-23
對於小型的Silverlight應用程式,可以把所有內容,包括資源,都包含在一個Xap包中釋出。對於開發者來說,是個很便利的選擇,可以把更多的精力和時間用到程式的功能方面,提高開發效率。但是對於使用者來說,如果xap檔案過大,需要下載幾分鐘或者更長時間才能看到實際效果,可能是一個很糟糕的使用者體驗,一定需要很大的勇氣和決心才會再次訪問。為了解決初始下載主包時間太長的問題,開發者一般會把比較大的音訊,視訊和圖片等資源從主包中剝離出來,使用動態下載方式。而無論是那種動態下載技術,WebClient類都扮演著十分重要的角色。我們需要深刻的認識和理解WebClient,才能更好的決定動態下載技術和策略。這一節作者首先介紹和剖析WebClient類。
 
首先看看官方的線上幫助,是最權威的解釋。用於上傳伺服器檔案的方法就不提了,這裡只關心用於下載的兩個方法:DownloadStringAsync和OpenReadAsync,一個用於下載字串,另一個下載檔案流。使用方法很相像,以OpenReadAsync為例,值得注意的有這麼幾點:
1. 此方法使用 GET 方法檢索指定的資源。資源是非同步下載的。
2. 在完成第一個下載操作前,不能對同一 WebClient 物件再次呼叫 OpenReadAsync 方法。執行此操作會導致異常。
3. 如果 BaseAddress 屬性不是空字串,且地址不包含絕對 URI,則該地址必須是相對 URI,此 URI 與 BaseAddress 組合在一起構成所請求資料的絕對 URI。
 
第一點非同步下載沒什麼好說的了,這對於好的使用者體驗是必須的,否則在下載過程中使用者只能絕望的等待,不能看到一點進一步的資訊,使用者是會瘋掉的。
第二點有點意思,是說一個WebClient 物件不可以同時進行兩個下載,否則會導致異常。不過言外之意是,如果想要同時下載另外一個檔案,可以建立一個新的WebClient 物件。作者未曾驗證過,希望沒有誤解權威的意思。
第三點很重要,WebClient需要一個絕對地址來進行下載。你可以直接提供一個絕對地址,沒問題。如果你打算用相對地址,則必須保證BaseAddress 與這個相對地址可以組合成正確的絕對地址。預設時BaseAddress 為主xap包的地址,例如http://localhost/ClientBin/MyApp.xap。那麼你一定要保證相對地址是相對於http://localhost/ClientBin/的。
 
注意對於DownloadStringAsync和OpenReadAsync 方法,還可以傳遞一個使用者自定義的引數,userToken。“userToken 作為傳遞到在完成非同步操作時呼叫的方法的 AsyncCompletedEventArgsUserState 屬性接收。
舉個例子來說,當呼叫OpenReadAsync 時,可以把檔名當作第二個引數。在註冊的下載完成的方法裡,e.UserState包含了該檔名,於是你就知道下載的是哪個檔案了。
 
WebClient還有一個十分酷的特性,可惜官方幫助沒有提及。WebClient可以與瀏覽器共享快取檔案!具體說來,如果你通過網頁瀏覽已經快取了某個檔案,當你用WebClient下載這個檔案時,WebClient會直接從快取檔案中直接讀取,不再重新下載。反之亦然,WebClient下載的檔案會儲存在瀏覽器快取目錄中,供瀏覽器和WebClient下次使用。這可是實現silverlight動態下載並快取的理論基礎,十分重要!!
 
當然有些時候開發者並不想使用快取檔案。例如伺服器檔案更新了,希望下載最新的檔案而不是快取的檔案。這種情況怎麼處理呢?有人提出了一個解決辦法:因為檔案快取是基於url的,如果在url後面加上一些隨機的無意義的字元,例如?o=123,則可繞過快取。缺點是每次下載都會增加新的快取檔案,浪費空間啊。
 
理論準備暫時就這麼多了,後面文章將詳細講述WebClient在動態下載中的具體應用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-630140/,如需轉載,請註明出處,否則將追究法律責任。

相關文章