Silverlight WebClient download progressivo
-
13-09-2019 - |
Pergunta
Estou tentando baixar progressivamente uma matriz de dados serializados. O objetivo é enviar um único grande bloco a partir do servidor, e parcialmente processá-lo no cliente enquanto ele baixa.
Eu estou usando a classe System.Net.WebClient e defini-lo é AllowReadStreamBuffering propriedade para false. De acordo com a documentação do MSDN, este deve permitir-me para acessar o fluxo de entrada a partir do evento OpenReadCompleted.
Quando tento acessar o fluxo, no entanto, ele lança um NotSupportedException. Esta não é uma questão de política de domínio cruzado, e se eu definir a propriedade AllowReadStreamBuffering aos verdadeiros carrega e lê o conteúdo perfeitamente. Estou esquecendo de algo? Como devo realizar downloads progressivos do Silverlight?
O código mínimo para replicar este problema é o seguinte:
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();
}
Solução
Não use WebClient para isso, mas sim soquetes (se possível).
Mike Schwarz tem um excelente cliente de soquete você pode usar
http: // weblogs .asp.net / mschwarz / Arquivo / 2008/03/07 / Silverlight-2-e-sockets.aspx
Outras dicas
Você está no IE e download menos de 4KB de dados? IE não vai dar-lhe os dados até que você tenha mais de 4KB dele. Depois de 4KB, você tem toda a granularidade que você precisa. Possíveis soluções:
- Enviar dados de lixo para chegar até a 4KB
- Se você sabe que o pedido vai ser pequeno, definir AllowReadStreamBuffering para true.