métodos WCF com grandes conjuntos de resultados - rastrear visualmente o progresso de transferência

StackOverflow https://stackoverflow.com/questions/1421893

  •  07-07-2019
  •  | 
  •  

Pergunta

Eu tenho um serviço WCF que tem que retornar alguns conjuntos de dados que pode ser tão grande quanto 10 MB ou mais, eu quero um pouco feedback visual para o usuário sobre os progressos, existe uma maneira de acompanhar o progresso do download?

Meu cliente é Silverlight 3 e, finalmente, eu gostaria de ser capaz de ligar uma barra de progresso a este; quaisquer ideias?

EDIT: Após a recompensa selecionada SO automaticamente a resposta com upvotes como a resposta correta quando este não é o caso.

Foi útil?

Solução

Há um exemplo disso no projeto de código, consulte:

http://www.codeproject.com/KB/WCF/WCF_FileTransfer_Progress.aspx

Outras dicas

Se você tiver uma chamada WCF gigante, então você só tem dois estados, tudo ou nada. Além disso, WCF tem um tamanho máximo de transação, assim retornando um grande conjunto de dados corre o risco de ultrapassar este limite.

A fim de resolver estes problemas em meus projetos, eu dividir a um pedido grande para muitos pedidos menores. Eu, então, verificar quantas respostas eu tenho vs. solicitações originais para obter uma indicação de progresso.

Edit:. Adicionado explicação melhor

O CodeProject artigo pode ser complicado para começar a trabalhar com o Silverlight desde o Silverlight só tem acesso ao BasicHttpBinding - embora parece que BasicHttpBinding tem uma TransferMode = "Streamed" talvez, por isso é possível -. Eu não sei

Se você pode obtê-lo para retornar um Stream, que parece que seria a melhor abordagem.

Ainda assim, eu pensei que eu iria apresentar uma abordagem aleatória "outro".

Talvez você possa serializar os dados em um arquivo e usar o Cliente Web para fazer o download. Então, basicamente, você teria um WS.GetData (), que iria salvar um arquivo no servidor e retornar o nome do arquivo -., Em seguida, o aplicativo Silverlight iria usar WebClient para baixá-lo (que tem um evento DownloadProgressChanged)

Eu sei que não é o que você está procurando - apenas uma idéia ...

Editar : Eu respondi esse pensamento que queria um uploader de Silverlight, mas ele realmente parece que você quer um downloader Silverlight. Você pode fazer a mesma coisa que eu sugeri para o uploader exceto uso HTTP GET, ou Binary WCF, ou Sockets.

Eu escrevi um uploader de Silverlight 2 com uma barra de progresso e eu modelei-lo depois esta . Ele usa HTTP POST a enviou o arquivo para o servidor uma peça de cada vez. A parte complicada é que quanto maior o seu post, mais rápido o arquivo será enviado, mas sua barra de progresso só é atualizado uma vez por POST. Então eu escrevi um algoritmo que tenta dinamicamente para encontrar o maior tamanho POST que leva menos de um segundo.

Se você quiser usar WCF em vez de HTTP POST, que é provavelmente melhor porque Silverlight 3 agora suporta codificação de mensagem binária:

Ou você poderia escrever uma aplicação soquetes - Silverlight suporta isso, mas pode ser um pouco complicado de configurar e requer o servidor para ter uma porta no intervalo 4502-4532 aberto e porta 943 aberta para um arquivo de política .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top