Question

J'essaie de télécharger un fichier ou un flux de données sur notre serveur Web et je ne trouve pas de moyen décent de le faire.j'ai essayé les deux WebClient et WebRequest les deux ont leurs problèmes.

Client Web
Agréable et facile, mais vous ne recevez aucune notification indiquant que le téléchargement asynchrone est terminé, et le UploadProgressChanged l'événement n'est pas rappelé avec quoi que ce soit d'utile.L'alternative est de convertir vos données binaires en chaîne et d'utiliser UploadStringASync parce qu'alors au moins tu auras un UploadStringCompleted, le problème est que vous avez besoin de beaucoup de RAM pour les gros fichiers car il encode toutes les données et les télécharge en une seule fois.

HttpWebRequête
Un peu plus compliqué mais fait toujours ce qui est nécessaire, le problème que j'obtiens est que même s'il est appelé sur un fil d'arrière-plan (soi-disant), il semble toujours bloquer mon interface utilisateur et l'ensemble du navigateur jusqu'à ce que le téléchargement soit terminé, ce qui ne semble pas tout à fait droite.

Normal .net a certains appropriés WebClient méthodes pour OnUploadDataCompleted et des progrès mais ceux-ci ne sont pas disponibles dans Silverlight .net...grosse omission je trouve !

Quelqu'un a-t-il des solutions, je dois télécharger plusieurs fichiers binaires de préférence avec une progression, mais je dois effectuer certaines actions lorsque les fichiers ont terminé leur téléchargement.

J'attends avec impatience de l'aide à ce sujet.

Était-ce utile?

La solution

La façon dont je contourne ce problème se fait via INotifyPropertyChanged et la notification d'événements.

Les essentiels:

 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");
            }
        }

À l'heure actuelle, Silverlight est un PiTA en raison des appels Async doubles et triples.

Autres conseils

Merci, le problème que je peux voir avec l'article est qu'il ne parle pas de Silverlight, et Silverlight a des fonctions limitées, pour une raison quelconque, ils ont supprimé sans raison certains événements et méthodes nécessaires aux transferts binaires.

Je dois utiliser Silverlight car j'ai besoin/vouloir télécharger plusieurs fichiers et HTML ne permet pas le téléchargement de plusieurs fichiers.

Matt Berseth a eu quelques réflexions à ce sujet, qui pourraient aider :

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

@Dan - Désolé mon pote, j'aurais juré que l'article de Matt concernait Silverlight, mais ce n'est clairement pas le cas.C'est la faute à ces deux grands verres de rouge chilien que je viens de boire.:-)

C'était à peu près ce que je faisais, le problème que j'avais était que mon interface utilisateur était verrouillée.

Comme vous l'avez suggéré ce que je faisais déjà, j'ai supposé que le problème était ailleurs, j'ai donc utilisé l'ancienne méthode diviser pour régner pour affiner le problème et ce n'était pas le code de mise à jour réel, c'était ma tentative de Expédition une demande de mise à jour de ma barre de progression pendant le code du flux de téléchargement.

Merci pour le conseil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top