如果下载成功,为什么WebClient.OpenReadAsync会返回零长度的e.Result?

时间:2010-10-06 13:22:30

标签: silverlight silverlight-4.0 download webclient silverlight-oob

使用以下代码(来自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 />
}

有什么想法吗?

3 个答案:

答案 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不存在此问题,因此我将改为使用它来代替。