3

シリアル化されたデータの配列を徐々にダウンロードしようとしています。目標は、サーバーから単一の大きなブロックを送信し、ダウンロード中にクライアントで部分的に処理することです。

私は System.Net.WebClient クラスを使用しており、その AllowReadStreamBuffering プロパティを false に設定しています。MSDN のドキュメントによると、これにより、OpenReadCompleted イベントから着信ストリームにアクセスできるようになるはずです。

ただし、ストリームにアクセスしようとすると、NotSupportedException がスローされます。これはクロスドメイン ポリシーの問題ではありません。AllowReadStreamBuffering プロパティを true に設定すると、コンテンツが完全に読み込まれて読み取られます。何か不足していますか?Silverlight からプログレッシブ ダウンロードを実行するにはどうすればよいですか?

この問題を再現するための最小限のコードは次のとおりです。

    private void BeginProgressiveDownload()
    {
        WebClient client = new WebClient();
        client.AllowReadStreamBuffering = false;
        client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        client.OpenReadAsync(new Uri("http://STREAMABLE RESOURCE HERE"));
    }

    void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        e.Result.ReadByte();
    }
4

2 に答える 2

0

IE を使用していて、4kb 未満のデータをダウンロードしていますか? IE は、4kb 以上になるまでデータを提供しません。4kb を超えると、必要なすべての粒度が得られます。可能な解決策:

  • ガベージ データを送信して、最大 4kb を取得します
  • リクエストが小さいことがわかっている場合は、AllowReadStreamBuffering を true に設定します。
于 2009-06-11T15:27:56.067 に答える
0

これには WebClient を使用しないでください。むしろソケットを使用してください (可能な場合)。

Mike Schwarz には、使用できる優れたソケット クライアントがあります。

http://weblogs.asp.net/mschwarz/archive/2008/03/07/silverlight-2-and-sockets.aspx

于 2009-06-11T23:53:03.357 に答える