Pergunta

Estou tentando fazer upload de um arquivo ou fluxo de dados para nosso servidor web e não consigo encontrar uma maneira decente de fazer isso.Eu tentei os dois WebClient e WebRequest ambos têm seus problemas.

Cliente da web
Agradável e fácil, mas você não recebe nenhuma notificação de que o upload assíncrono foi concluído e o UploadProgressChanged O evento não é chamado de volta com nada útil.A alternativa é converter seus dados binários em uma string e usar UploadStringASync porque então pelo menos você ganha um UploadStringCompleted, o problema é que você precisa de muita memória RAM para arquivos grandes, pois ele codifica todos os dados e os carrega de uma só vez.

HttpWebRequest
Um pouco mais complicado, mas ainda faz o que é necessário, o problema que estou recebendo é que, embora seja chamado em um thread em segundo plano (supostamente), ainda parece estar bloqueando minha interface do usuário e todo o navegador até que o upload seja concluído, o que não parece muito certo.

O .net normal tem alguns recursos apropriados WebClient métodos para OnUploadDataCompleted e progresso, mas estes não estão disponíveis no Silverlight .net ...grande omissão, eu acho!

Alguém tem alguma solução, preciso fazer upload de vários arquivos binários, de preferência com progresso, mas preciso realizar algumas ações quando os arquivos tiverem concluído o upload.

Aguardo alguma ajuda com isso.

Foi útil?

Solução

A maneira de contornar isso é através de INotifyPropertyChanged e notificação de eventos.

Os essenciais:

 public void DoIt(){
this.IsUploading = True;    

        WebRequest postRequest = WebRequest.Create(new Uri(ServiceURL));

        postRequest.BeginGetRequestStream(new AsyncCallback(RequestOpened), postRequest);
    }

private void RequestOpened(IAsyncResult result){
      WebRequest req = result.AsyncState as WebRequest;
   req.BeginGetResponse(new AsyncCallback(GetResponse), req);
    }

  private void GetResponse(IAsyncResult result)
        {
            WebRequest req = result.AsyncState as WebRequest;
              string  serverresult = string.Empty;
              WebResponse postResponse = req.EndGetResponse(result);

              StreamReader responseReader = new StreamReader(postResponse.GetResponseStream());

this.IsUploading= False;
}

 private Bool_IsUploading;
        public Bool IsUploading
        {
            get { return _IsUploading; }
          private  set
            {

                _IsUploading = value;

                OnPropertyChanged("IsUploading");
            }
        }

No momento, o Silverlight é um PiTA por causa das chamadas Async duplas e triplas.

Outras dicas

Obrigado, o problema que posso ver no artigo é que não está falando sobre o Silverlight, e o Silverlight tem funções limitadas, por algum motivo eles removeram alguns eventos e métodos necessários para transferências binárias sem motivo.

Preciso usar o Silverlight porque preciso/desejo fazer upload de vários arquivos e o HTML não permite o upload de vários arquivos.

Matt Berseth teve algumas ideias sobre isso, pode ajudar:

http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html

@Dan - Desculpas, cara, eu poderia jurar que o artigo de Matt era sobre o Silverlight, mas claramente não é.A culpa é daqueles dois copos grandes de tinto chileno que acabei de beber.:-)

Isso era basicamente o que eu estava fazendo, o problema que estava enfrentando era que minha IU estava travando.

Como você sugeriu o que eu já estava fazendo, presumi que o problema estava em outro lugar, então usei o antigo dividir e conquistar para restringir o problema e não era o código de atualização real, foi minha tentativa de Despacho uma solicitação para atualizar minha barra de progresso durante o upload do código do stream.

Obrigado pelo conselho.

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