例子:Background Transfer Service Sample
本例演示了如何使用后台传输服务来进行后台文件下载,也就是说及时App已经停止运行,同样可以通过后台代理进行文件的下载操作。
对于后台文件传输一下知识点必须注意:
1. 通过使用 BackgroundTransferRequest 对象的 Method 属性来设置传输方法, Get, Post。
2. 后台传输的所有本地路径都必须位于您应用程序的独立存储中,在名为“/shared/transfers”的根目录中。
3.由于多个应用程序可能已排列后台传输,因此在先前添加的传输完成之后、传输开始之前可能有额外的延迟。
4. BackgroundTransferRequest 对象的 Headers 属性用于设置传输请求的 HTTP 标头。后面header item不可修改(If-Modified-Since,If-None-Match,Unless-Modified-Since,Range。。。)
5. 诸多限制:
操作系统对于与文件大小、连接速度以及设备资源有关的后台传输强制很多限制。本节列出了 Windows Phone 的后台传输策略。请注意,Windows Phone 模拟器模拟与 Wi-Fi 和外部电源相连的设备。若要验证应用程序是否在其他条件下工作,您应该在物理设备上进行测试。
大小
上传最大文件大小 |
5 MB |
通过手机网络连接的最大下载大小 |
20 MB - 如果超过此限制,则传输的 TransferPreferences 属性将自动更改为 AllowBattery,它对需要 Wi-Fi 的传输有影响。 |
通过 Wi-Fi 而没有外部电源的最大下载大小 |
100 MB – 大于 100 MB 的文件必须将传输的 TransferPreferences 属性设置为 None,否则传输将失败。如果不知道传输文件的大小,则其有可能会超出该限制,您应将值设置为 None。 |
限制
每个应用程序的队列中未完成的最大请求数(这包括活动和挂起的请求)。 |
5 - 完成后不会自动从队列中删除传输。应用程序应该使用Remove(BackgroundTransferRequest) 从队列中删除完成的传输,以便为新的传输留出空槽。 |
设备上所有应用程序的最大并发传输数 |
2 |
设备上所有应用程序的最大排队传输数 |
500 |
每个请求的最大 HTTP 标头数 |
15 |
HTTP 标头的最大大小 |
每个 16 KB |
策略
-
在非并发语音和数据网络上不运行后台传输服务,其中包括:
-
2G、EDGE、标准 GPRS
后台传输服务在 3G 以及更高版本的网络上运行。
-
-
服务器端所需的文件内容长度标头大于 5 MB。服务器应该始终在响应中返回内容长度。不这样做可能会导致严重降低传输的性能。
-
服务器端所需的文件范围标头大于 5 MB。服务器应该始终支持范围请求标头。不这样做可能会导致严重降低传输的性能。
慢速传输
如果设备的网络连接速度低于以下速率,则会暂停传输并重试。这些限制(单位为 Kb/s)比较低,因此通常不会达到。
网络媒介 |
最低数据速率 |
---|---|
3G |
50 Kbps |
Wi-Fi/USB |
100 Kbps |
- 代码实现
1. 创建后台下载任务的特定目录
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication()) { if (!isoStore.DirectoryExists("/shared/transfers")) { isoStore.CreateDirectory("/shared/transfers"); } }
2. 创建BackgroundTransferRequest对象,并且初始化request各项请求属性
string transferFileName = ((Button)sender).Tag as string; Uri transferUri = new Uri(Uri.EscapeUriString(transferFileName), UriKind.RelativeOrAbsolute); // 创建transfer request, BackgroundTransferRequest transferRequest = new BackgroundTransferRequest(transferUri); // GET and POST are supported. transferRequest.Method = "GET"; // 获取下载文件到 "transfers" 目录 string downloadFile = transferFileName.Substring(transferFileName.LastIndexOf("/") + 1); Uri downloadUri = new Uri("shared/transfers/" + downloadFile, UriKind.RelativeOrAbsolute); transferRequest.DownloadLocation = downloadUri; // 自定义tag transferRequest.Tag = downloadFile;
3. 设置 WIfi,外接电源等相关信息到request
if (wifiOnlyCheckbox.IsChecked == false) { transferRequest.TransferPreferences = TransferPreferences.AllowCellular; } if (externalPowerOnlyCheckbox.IsChecked == false) { transferRequest.TransferPreferences = TransferPreferences.AllowBattery; } if (wifiOnlyCheckbox.IsChecked == false && externalPowerOnlyCheckbox.IsChecked == false) { transferRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery; }
4. 注册Request相关事件处理 (下载进度,下载状态改变)
TransferStatus.Completed
TransferStatus.WaitingForExternalPower
TransferStatus.WaitingForWiFi
etc ....
transferRequest.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(transfer_TransferStatusChanged); transferRequest.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(transfer_TransferProgressChanged); ProcessTransfer(transferRequest);
5. 添加到手机系统后台传输的队列(不一定能马上执行下载)
try { BackgroundTransferService.Add(transferRequest); }
posted on 2013-08-14 14:27 Amazing-Ren 阅读(331) 评论(0) 编辑 收藏 举报