通过Stream.Read下载文件时出现ArgumentOutOfRangeException

时间:2012-08-21 21:13:57

标签: c# silverlight webclient

在Silverlight上下载非常大的文件(> 2GB)时,我一直在努力解决问题。我的应用程序是运行时具有提升权限的浏览器外下载管理器。

当文件达到某个数据量(2GB)时,它会抛出以下异常:

System.ArgumentOutOfRangeException was caught
  Message=Specified argument was out of the range of valid values.
Parameter name: count
  StackTrace:
   in MS.Internal.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
   in MS.Internal.InternalNetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   in MySolution.DM.Download.BeginResponseCallback(IAsyncResult ar)
  InnerException: 
Null

我唯一的线索是this site,他显示BeginCode实施。仅当count为< 1 {}时才会发生此异常。然后是0。

我的代码

/* "Target" is a File object. "source" is a Stream object */

var buffer = new byte[64 * 1024];
int bytesRead;
Target.Seek(0, SeekOrigin.End); // The file might exists when resuming a download

/* The exception throws from inside "source.Read" */
while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
{
    Target.Write(buffer, 0, bytesRead);
    _fileBytes = Target.Length;
    Deployment.Current.Dispatcher.BeginInvoke(() => { DownloadPercentual = Double.Parse(Math.Round((decimal)(_fileBytes / (_totalSize / 100)), 5).ToString()); });
}

Target.Close();
logFile.Close();

错误发生在不同类型的文件中,它们来自Amazon S3上的公共存储桶。 (使用常规的http请求)。

1 个答案:

答案 0 :(得分:1)

我搜索了一下,看起来这是Silverlight中的一个已知限制。一种可能的解决方法是使用Range标头在多个部分中执行下载,每个部分小于2GB。