Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    59

    [C#] Problema classe WebRequest

    TRamite un bottone viene eseguito il comando:

    codice:
    WebClient request = new WebClient();
    request.DownloadFileAsync(new Uri("http://debian.fastweb.it/debian-cd/3.1_r2/i386/iso-cd/debian-31r2-i386-binary-1.iso"), "debian.iso");
    il problema è che il file debian.iso non cambia la dimensione e resta = 0 kb. Il link funziona perchè con ie8 riesco a scaricarlo. Ho provato a disattivare il firewall ma niente. Da cosa può dipendere?? Stesso problema si è verificato con un uri ftp. Grazie

    PS: con il comando
    codice:
    serverRequest = WebRequest.Create("ftp://debian.fastweb.it/debian-cd/3.1_r2/i386/iso-cd/debian-31r2-i386-binary-1.iso");
    il file viene salvato

  2. #2
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    ciao, hai provato ad agganciare gli eventi DownloadProgressChanged e DownloadFileCompleted prima di lanciare il download asincrono?

    Hai anche provato con un file piccolo? Se non ricordo male il file lo trovi disponibile su filesystem al completamento dell'operazione. Lanciando un'operazione asincrona, la tua applicazione continua il processo mentre il thread effettua il download del file.

    Prova ad agganciare gli eventi che ti ho detto e verifica l'avanzamento del download. Per fare prima prova a scaricare un file di piccole dimensioni in modo da testare tutto il tuo codice


  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    59
    Ho controllato come hai detto i byte ricevuti e il download progredisce. Il fatto è che utilizzo questo indirizzo per eseguire un test della velocità di download praticamente scarico da tale indirizzo per 30 secondi poi vedo la grandezza del file scaricato. Faccio cosi:

    codice:
    request.DownloadFileAsync(new Uri("http://debian.fastweb.it/debian-cd/3.1_r2/i386/iso-cd/debian-31r2-i386-binary-1.iso"), "debian.iso");
                //avvio timer
                timestart = Environment.TickCount;
                timestop = Environment.TickCount + (TempDown * 1000);//da sec a ms
                int temp = Environment.TickCount;
                while (Environment.TickCount <= timestop)//controllo che tempo minore del limite impostato e aggiorno progressbar
                {
                    if (temp + 1000 <= Environment.TickCount)
                    {
                        try
                        {
                            progressBar1.Invoke(new BarDelegate(UpdateBar));
                        }
                        catch (InvalidOperationException)
                        {
                            break;
                        }
                        temp = temp + 1000;
                    }
                }
                request.CancelAsync();//fermo download
                System.Threading.Thread.Sleep(1000);
                //leggo lunghezza file
                FileInfo file = new FileInfo("debian.iso");
                long lung = file.Length;
    i dati scaricati non vengono salvati nel file debian.iso, come posso fare??

  4. #4
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    puoi provare con un timer. Imposti il timeout a 30sec e quando scatta l'evento elapsed controlli quanti bytes hai scaricato.

    Verifica che il tutto sia thread-safe (usa variabili globali e statiche) e magari puoi stoppare il download sempre nell'evento elapsed.


    Questa è la prima idea che mi è venuta, magari ci sono altre soluzioni migliori

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    59
    Ho cercato su internet ma non ho trovato, magari lo sai se è possibile chiamare tale funzione solo una volta (per leggere i byte ricevuti) perchè altrimenti viene eseguita continuamente.

    Ho quindi provato questo codice che viene eseguita dalla funzione download:
    codice:
    request.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback);
    e che richiama
    codice:
     private void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
            {
                // Displays the operation identifier, and the transfer progress.
                Byte_Download = e.BytesReceived;
                textBox7.BeginInvoke(new UpdateTextCallback2(SetText2), new object[] { " " + Byte_Download });
            }
    se stampo Byte_Download nella textbox7 viene visualizzato il valore se invece vado a leggerlo in download risulta = 0. Byte_Download è ovviamente una variabile globale. Dove sbaglio??

  6. #6
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    imposta la variabile totByte statica e globale.

    Poi imposti il timer in modo che l'evento elapsed scatti una sola volta (mi pare sia necessario impostare autoreset a true) e agganci l'evento timer_elapsed.

    Poi fai partire il timer ed il download (dichiarando l'oggetto webrequest statico e globale.

    Nell'evento downloadProgressetcetc incrementi totByte (totByte += byte ricevuti) e nel codice dell'evento elapsed del timer fermi il download e valuti il valore di totbyte.

    Magari non sarà precisissimo al bit, però così dovrebbe andare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.