Winphone文件傳輸backgroundfileTransfer,上傳或下載文件

http://www.silverlightchina.net/html/zhuantixilie/winphone7/2012/0301/14170.htmlhtml

http://www.cnblogs.com/webabcd/archive/2012/07/16/2592989.html web

有一種坑(限制),叫人內心憔悴~~~app

請注意看清楚限制。。less


Windows Phone 7 – Background File Transfer

 學了一陣子關於Background Agent的運用後,感受WP7在Background上的處理,讓開發人員學習很是容易,但有些觀念可能須要本身多花點時間來看,以避免在送審程式時花了很多的時間成本。ide

  今天要介紹的是Background File Transfer,這是WP7.1 SDK提供的另外一個Backgrund Agent,適合使用的情境可想而知:運用於傳輸大量檔案、背景與Server端交換資訊等。所以,往下將針對重點部分一一說明:學習

  〉Microsoft.Phone.BackgroundTransfer:spa

  WP7.1 SDK提供應用程式佇列一至多個檔案進行上傳/下載,而且讓任務可在背景環境下繼續執行,甚至是該應用程式已長時間不在前景執行,另外該API也提供擷取、查詢目前file transfer運行的狀態,讓end user能夠了解目前的存取狀態。這些功能在Microsoft.Phone.BackgroundTransfer裡都能找到,接着往下介紹二個重要元件:.net

  A. BackgroundTransferRequest與BackgroundTransferService:orm

  A-1. BackgroundTransferRequest:htm

  該物件表明一個transfer request,其內容包括:目標、檔案路徑、傳輸方法與如今的傳輸狀態。

  另外,當transfer request下載完成觸發completed事件時,記得唿叫background transfer service將這個transfer request進行remove,由於系統必不會自動把它移去。

  重點屬性說明:

Name Description
DownloadLocation 取得/設定request檔案下載後要儲存的local path。可搭配建構子一塊兒設定。
Headers 取得request的HTTP headers集合(Dictionary)。
Method 取得/設定request使用的HTTP Method。
TransferPreferences 取得/設定何種條件下transfer能夠被使用,屬於列舉值:TransferPreferences Enumeration。可參考[補充]的說明。
TransferStatus 取得transfer的狀態。可配合BytesReceived與BytesSent擷取進度時使用。
TransferError 若是transfer執行了completed,TransferError一般是null。相反的,不爲null則表明有錯誤發生。


  另外,二個重要的事件:TransferProgressChanged與TransferStatusChanged留到範例來講明。

  A-2. BackgroundTransferService:

  該物件用於初始化一個新的transfer、查詢或管理已存在的file transfers。其任務爲控制全部的transfer物件,然而,BackgroundTransferRequest.Method僅支援HTTP與HTTPS,尚不支援FTP的協定,因此目前能夠透過GET/POST上傳或下載檔案。

  重點屬性說明:

Name Description
Requests 取得向BackgroundTransferServicec中全部啓動的transfer requests。其角色與ScheduledActionService中的GetActions很類似。
Add 增長background transfer request至佇列中。
Find 透過指定的ID(RequestId)去企圖取回特定的background transfer reqeust。
Remove 透過指定的ID(RequestId)去企圖移除特定的background transfer reqeust。


  瞭解了BackgroundTransferService的角色以後,要特別注意的是:

  a-2-1. 每個應用程式只能有5個request在給定的時間內。

  a-2.2. 企圖增長超過5個request時,系統會自動發出Exception。

  a-2-3. 若是要移除佇列中的request,請透過Remove的方法,該方法移除成功後會觸發Completed的事件。

  C. Background Transfer Policies (Background Transfer基本守則):

  C-1. File System Restrictions(檔案路徑使用條件):

  全部的background trasnfers都須要有一個 local file path(實際本機路徑)。下載檔案須要指定要儲存的實際位置;

  上傳檔案需指定要從那一個實際位置將檔案上傳,所以,全部的background tansfers使用的檔案路徑,必須存在於isolated storage的固定路徑:「/shared/transfers」之中,該資料表是在程式被安裝至設備後,自動產生出來的,若是本身手動刪除或改名了,必須再重建一個相同名稱的資料夾,才能初始化全部的transfers物件。

  另外,可在/shared/transfers資料夾下建構須要檔案結構,這是合法的,但若是使用transfers時使用的是非特定的路徑,那transfer將沒法被初始化則會出現exception。

  C-2. Sizes(檔案大小):

最大上傳檔案大小 5 MB
在行動網路,最大下載檔案大小 20 MB 
若是檔案超過限制,TransferPreferences屬性會自動轉變成AllowBattery,這將變成要求於Wi-Fi環境下才能進行傳輸。
在Wi-Fi,沒有外接電源,最大下載檔案大小 100 MB 
若是檔案超過100 MB,需設定TransferPreferences屬性爲"None",不然傳輸會失敗。若是應用時不肯定傳輸檔案的大小時,建議設定成None能夠確保傳輸程序不會被拒絕。


  C-3. Limits(限制):

每一個應用程序的最大未完成請求佇列量。(包括:active與pending的請求)
因爲傳輸完成後,傳輸請求並不會被自動移除,須要透過Remove(BackgroundTransferRequest)去除存在佇列中已完成的項目。
設備上跨全部應用程序的目前最大傳輸程序
當前最多隻有二個Background File Transfer在運做。
設備上跨全部應用程序的最大佇列傳輸程序 
(Maximum queued transfers across all applications on the device)
500
每一個Requeset的HTTP headers最大數量 15
HTTP headers的最大容量 16 KB each


  另外,在使用HTTP headers時,有幾個保留字是不可使用於BackgroundTransferRequest,以下:

  「If-Modified-Since」、「If-None-Match」、「If-Range」、「Range」與「Unless-Modified-Since」。

  C-4. Policies(守則):

  background file transfer不支援在「non-simultaneous voice」與「2G, EDGE, Standard GPRS」環境使用。

  =>所以,background file transfer只支援在Wi-Fi、3G(或更快速)的網路環境。

  當檔案大小超過5 MB時,HTTP headers中的「content-length」與「range」 是必要存在的。Server端應該

  永遠在response中回傳content-length的值。若是不這樣作,可能會形成嚴重的傳輸效能煺化。

  C-5. Slow Transfer(較慢的速度):

  若是網路的速度低於下列的速度,傳輸任務會被paused(暫停)與retried(從新連線):

  => 3G (50 kbps);Wi-Fi(100 kbps)

  〉範例說明:

  該範例爲撰寫一個透過手機下載圖示至本機IIS裡。看起來很是容易吧,由於在前年我已經有寫過一個下載檔案的程式範例:,當時是使用WebClient實做Download的功能,但它只能在程式執行時使用,今天範例則是要讓它也能在背景執行。

  a. 程式啓動後,先檢查「/shared/transfers」是否存在;

相關文章
相關標籤/搜索