2

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

有任何想法吗?

4

3 回答 3

1

我的猜测是因为底层流是一个分块响应,并且 HTTP 响应中没有给出 Content Length 标头。所以 Length 返回 0。在类 spec中使用 Length 没有任何意义。根据规范:

在使用此属性返回的数据之前,您应该检查 Error 和 Canceled 属性。如果 Error 属性的值为 Exception 对象或 Canceled 属性的值为 true,则异步操作未正确完成,Result 属性的值将无效。

所以我会忽略长度,检查这些字段,然后读到你的心。

于 2010-10-06T13:27:29.080 回答
1

数据下载有一个默认的 4Mb 限制。你增加了吗?

试试这个链接:http ://forums.silverlight.net/forums/p/21513/75649.aspx

<system.web>
    ... 
   <httpRuntime maxRequestLength="xxx" /> // Size in Kb
</system.web>
于 2010-10-06T13:27:34.450 回答
1

显然,使用WebClient非常大的文件存在“已知问题”。在某些情况下,这可能与Content-Length服务器未设置的问题有关。

根据通过 Fiddler2 捕获的数据,标头设置正确。
因此,我假设这不是我的具体问题的原因。

显然,HttpWebRequest 不存在此问题,因此我将考虑更改为使用它。

于 2010-10-07T08:30:16.843 回答