Domanda

Sto cercando di caricare un file o un flusso di dati sul nostro server web e non riesco a trovare un modo decente per farlo.Li ho provati entrambi WebClient E WebRequest entrambi hanno i loro problemi.

WebClient
Bello e facile, ma non ricevi alcuna notifica del completamento del caricamento asincrono e il file UploadProgressChanged l'evento non viene richiamato con nulla di utile.L'alternativa è convertire i dati binari in una stringa e utilizzare UploadStringASync perché così almeno ottieni un UploadStringCompleted, il problema è che hai bisogno di molta RAM per file di grandi dimensioni poiché codifica tutti i dati e li carica in una volta sola.

HttpWebRequest
Un po' più complicato ma fa comunque ciò che serve, il problema che riscontro è che anche se viene chiamato su un thread in background (presumibilmente), sembra comunque bloccare la mia interfaccia utente e l'intero browser fino al completamento del caricamento, il che non sembra del tutto Giusto.

Il normale .net ne ha alcuni appropriati WebClient metodi per OnUploadDataCompleted e progressi ma questi non sono disponibili in Silverlight .net...grande omissione credo!

Qualcuno ha qualche soluzione, devo caricare più file binari preferibilmente con un progresso, ma devo eseguire alcune azioni quando i file hanno completato il caricamento.

Attendo con ansia qualche aiuto con questo.

È stato utile?

Soluzione

Il modo per aggirare il problema è tramite INotifyPropertyChanged e la notifica degli eventi.

L'essenziale:

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

In questo momento Silverlight è un PiTA a causa delle chiamate Async doppie e triple.

Altri suggerimenti

Grazie, il problema che vedo nell'articolo è che non si parla di Silverlight e Silverlight ha funzioni limitate, per qualche motivo hanno rimosso alcuni eventi e metodi necessari per i trasferimenti binari senza motivo.

Devo utilizzare Silverlight perché ho bisogno/voglio caricare più file e l'HTML non consente il caricamento di più file.

Matt Berseth ha avuto alcune riflessioni a riguardo, potrebbe aiutare:

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

@Dan - Mi scuso amico, avrei giurato che l'articolo di Matt riguardasse Silverlight, ma chiaramente non è così.Tutta la colpa di quei due grandi bicchieri di rosso cileno che ho appena buttato giù.:-)

Questo era più o meno quello che stavo facendo, il problema che stavo riscontrando era che la mia interfaccia utente si stava bloccando.

Dato che mi hai suggerito quello che stavo già facendo, presumevo che il problema fosse da qualche altra parte, quindi ho usato il vecchio divide et impera per restringere il problema e non era il vero codice di aggiornamento, era il mio tentativo di Spedizione una richiesta di aggiornamento della barra di avanzamento durante il caricamento del codice dello streaming.

Grazie per il consiglio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top