Silverlight WebClient プログレッシブ ダウンロード
-
13-09-2019 - |
質問
シリアル化されたデータの配列を段階的にダウンロードしようとしています。目標は、単一の大きなブロックをサーバーから送信し、ダウンロード中にクライアント上で部分的に処理することです。
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();
}
解決
(可能な場合)。このためにWebクライアントを使用するのではなく、ソケットしないでください。
マイク・シュワルツは、あなたが使用できる優れたソケットクライアントを持っている。
ます。http://ブログ.asp.net / mschwarz /アーカイブ/ 2008/03/07 / Silverlightの-2-と-sockets.aspx の
他のヒント
IE を使用していてダウンロードしていますか 4kb未満のデータ?IE は 4kb 以上のデータを取得するまでデータを提供しません。4kb を超えると、必要な粒度がすべて揃います。可能な解決策:
- 最大4kbまでのガベージデータを送信
- リクエストが小さくなることがわかっている場合は、AllowReadStreamBuffering を true に設定します。