当前位置: 首页 - 编程技术 - 文章正文

Winphone文件传输backgroundfileTransfer,上传或下载文件

xiaoqihv

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

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

有一种坑(限制),叫人心里憔悴~~~

请注意看清楚限制。。

Windows Phone 7 – Background File Transfer

 学了一阵子关于Background Agent的运用后,感觉WP7在Background上的处理,让开发人员学习非常容易,但有些观念可能需要自己多花点时间来看,以免在送审程式时花了不少的时间成本。

  今天要介绍的是Background File Transfer,这是WP7.1 SDK提供的另一个Backgrund Agent,适合使用的情境可想而知:运用于传输大量档案、背景与Server端交换资讯等。因此,往下将针对重点部分一一说明:

  〉Microsoft.Phone.BackgroundTransfer:

  WP7.1 SDK提供应用程式伫列一至多个档案进行上传/下载,并且让任务可在背景环境下继续执行,甚至是该应用程式已长时间不在前景执行,另外该API也提供撷取、查询目前file transfer运行的状态,让end user可以了解目前的存取状态。这些功能在Microsoft.Phone.BackgroundTransfer裡都能找到,接着往下介绍二个重要元件:

  A. BackgroundTransferRequest与BackgroundTransferService:

  A-1. BackgroundTransferRequest:

  该物件代表一个transfer request,其内容包括:目标、档案路径、传输方法与现在的传输状态。

  另外,当transfer request下载完成触发completed事件时,记得唿叫background transfer service将这个transfer request进行remove,因为系统必不会自动把它移去。

  重点属性说明:

NameDescriptionDownloadLocation取得/设定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上传或下载档案。

  重点属性说明:

NameDescriptionRequests取得向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的请求)5 由于传输完成后,传输请求并不会被自动移除,需要透过Remove(BackgroundTransferRequest)去除存在伫列中已完成的项目。设备上跨所有应用程序的目前最大传输程序2 当前最多只有二个Background File Transfer在运作。设备上跨所有应用程序的最大伫列传输程序 (Maximum queued transfers across all applications on the device)500每个Requeset的HTTP headers最大数量15HTTP 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」是否存在;

转载于:https://blog.51cto.com/fanxz/1548828

文章地址:https://wenmayi.cn/post/9496.html