使用以下代码(来自Silverlight 4 OOB应用程序)我得到一个大小为零的结果流,即使它花费时间下载整个文件(900 + MB)并且没有报告错误。 Fiddler还说已经下载了整个文件。
进度处理程序已更改(尽管未在下面显示),但报告下载百分比增加。
这适用于较小的文件(10MB)。
var wc = new WebClient();
wc.OpenReadCompleted += DownloadWholeFileOpenReadCompleted;
wc.DownloadProgressChanged += DownloadWholeFileDownloadProgressChanged;
wc.OpenReadAsync(new Uri(movie.DownloadUrl, UriKind.Absolute));
private static void DownloadWholeFileOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Cancelled)
{
return; // this is not hit
}
if (e.Error != null)
{
return; // this is not hit
}
using (var fs = new FileStream(tempFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
var buffer = new byte[4096];
int bytesRead;
// <snip />
// e.Result.Length this equals 0
while ((bytesRead = e.Result.Read(buffer, 0, buffer.Length)) != 0)
{
fs.Write(buffer, 0, bytesRead);
}
fs.Close();
}
// <snip />
}
有什么想法吗?
答案 0 :(得分:1)
我的猜测是因为底层流是一个分块响应,并且在HTTP响应中没有给出内容长度标头。所以长度返回0.在class spec中使用长度没有任何意义。根据规范:
你应该检查错误和 使用之前取消的属性 由此返回的数据 属性。如果是Error属性的话 value是一个Exception对象或者 取消的财产的价值是真的, 异步操作没有 正确完成和结果 财产的价值无效。
所以我会忽略长度,检查这些字段,然后阅读你心中的内容。
答案 1 :(得分:1)
数据下载有默认的4Mb限制。你增加了吗?
试试此链接:http://forums.silverlight.net/forums/p/21513/75649.aspx
<system.web>
...
<httpRuntime maxRequestLength="xxx" /> // Size in Kb
</system.web>
答案 2 :(得分:1)
显然,使用WebClient
和非常大的文件存在“已知问题”。在某些情况下,这可能与服务器未设置Content-Length
的问题相关联。
根据通过Fiddler2捕获的数据,正确设置标题 因此,我认为这不是我具体问题的原因。
显然,HttpWebRequest不存在此问题,因此我将改为使用它来代替。