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 を返します。クラス仕様で Length を使用することについては何もありません。仕様によると:

このプロパティによって返されるデータを使用する前に、Error プロパティと Canceled プロパティを確認する必要があります。Error プロパティの値が Exception オブジェクトであるか、Canceled プロパティの値が true の場合、非同期操作は正しく完了していないため、Result プロパティの値は無効になります。

したがって、Length を無視し、それらのフィールドを確認してから、心ゆくまで読み上げます。

于 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 に答える