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();
    }
Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top