iOS Xamarin.iOS已损坏的网络下载

iOS Xamarin.iOS已损坏的网络下载,xamarin.ios,httpwebrequest,corruption,Xamarin.ios,Httpwebrequest,Corruption,我有一个用Xamarin.iOS编写的应用程序,它会在文件下载到应用程序后导致文件损坏 我通过在应用程序中下载文件,然后将下载的文件上载到dropbox来比较校验和。然后,我将dropbox文件的校验和与服务器上的原始文件进行比较 通常,校验和匹配。有时,校验和不匹配。这些文件实际上是视频,它导致视频无法播放 问题 如何使用HttpWebRequest下载时偶尔会导致文件损坏,但继续成功下载 代码 公共类下载服务:IDownloadService { private const int Buff

我有一个用Xamarin.iOS编写的应用程序,它会在文件下载到应用程序后导致文件损坏

我通过在应用程序中下载文件,然后将下载的文件上载到dropbox来比较校验和。然后,我将dropbox文件的校验和与服务器上的原始文件进行比较

通常,校验和匹配。有时,校验和不匹配。这些文件实际上是视频,它导致视频无法播放

问题 如何使用HttpWebRequest下载时偶尔会导致文件损坏,但继续成功下载

代码 公共类下载服务:IDownloadService { private const int BufferSize=1024*1024; /// ///将远程文件下载到本地位置。 /// ///要下载的文件的url。 ///保存文件的本地路径。 ///下载百分比|字节读取|总字节的进度。 ///如果要取消下载,可以将对布尔值的引用设置为true。 /// ///返回已下载的本地文件。 ///使用此参数而不是localPath参数,因为您可能没有传递任何扩展,要求我们自动确定扩展。 /// 公共字符串下载文件字符串url、字符串本地路径、操作进度、引用bool取消 { 取消=假; var=false; HttpWebRequestWebRequest=HttpWebRequestWebRequest.Createurl; webRequest.ReadWriteTimeout=3000; var buffer=新字节[BufferSize]; var realPath=localPath; 尝试 { 使用var response=webRequest.GetResponse { //获取此请求的总大小 var totalSize=0; 试试{totalSize=int.Parseresponse.Headers[MediaItemLength]; }catchException ex{抛出新的NotImplementedException以其他方式获取总大小!;} //确保有适当的分机 如果string.IsNullOrEmptyPath.GetExtensionlocalPath { //给定的localpath没有扩展名。 //我们需要尝试通过自定义HTTP头来确定exention。 字符串httpHeaderExtension=null; 尝试 { httpHeaderExtension=response.Headers[MediaExtension]; if string.isNullOrEmptyHttpHeader扩展名 抛出新异常标题存在,但为空。; } 捕获异常 { throw new ExceptionlocalPath没有提供扩展,我们无法通过自定义HTTP头推断它会提供扩展。; } //将正确的扩展名添加到本地文件路径 realPath+=httpHeaderExtension; } ifFile.ExistsrealPath File.DeleterealPath; 使用var responseStream=response.GetResponseStream { 使用var dest=new FileStreamrealPath、FileMode.CreateNew、FileAccess.Write { 长totalBytes=0; int当前块大小; 而currentBlockSize=responseStream.Readbuffer,0,buffer.Length>0 { totalBytes+=currentBlockSize; 变量百分比=inttotalBytes*100.0/totalSize; 目标写入缓冲区,0,currentBlockSize; 如果进度!=null progresspercentage、totalBytes、totalSize; 如果取消 { didCancel=真; 打破 } } } } } }特例 { //删除该文件 如果File.ExistsrealPath File.DeleterealPath; 投 } //删除该文件 如果没有取消&&File.ExistsrealPath File.DeleterealPath; 返回realPath; } }
代码非常简单。我确实包含了一些额外的/自定义的头来获取总文件大小,这样我就可以避免头请求来获取值。我需要下载进度的总文件大小。

我怀疑这可能与设备进入睡眠状态和wifi禁用有关。似乎偶尔不会抛出错误。我添加了一个检查,将下载的文件大小与服务器上的文件大小进行比较,以进行验证,而不是依赖一个异常来正确抛出。它是否有效@Paul
Knopf?@PaulKnopf您是否考虑过使用iOS的本机网络处理程序来防止这些问题?请参见以下参考: