Upload via FTP con Fastweb

di il
10 risposte

Upload via FTP con Fastweb

Buongiorno.
Ho un'applicazione VB.Net che effettua via FTP l'upload di alcuni file sul server web dell'utente. Uno di questi utenti ha cambiato provider, passando a Fastweb, e l'upload non funziona più. Da notare però che l'upload funziona regolarmente usando un client FTP come Filezilla.
Questo è un estratto del codice VB.Net (semplificato) che funziona con tutti gli altri provider. (Ignorate le chiamate a ShowProgress che è semplicemente la visualizzazione di una ProgressBar)

   Public Function FtpWeb(Filenames As List(Of String)) As Boolean
       Try
           Dim iX As Integer = 0
           Dim sExt As String
           Dim iProgressStep As Integer
           If Filenames.Count = 0 Then
               ShowProgress(0, "Nessun file da trasferire" & Constants.vbCrLf)
               Return True
           Else
               iProgressStep = 100 \ (Filenames.Count * 2)
           End If
           
           'Start
           ShowProgress(0, Constants.vbCrLf)
           For Each FileName In Filenames
               Dim request As FtpWebRequest = DirectCast(WebRequest.Create(gsDestPath & "/" & FileName), FtpWebRequest)
               request.Method = WebRequestMethods.Ftp.UploadFile
               request.Credentials = New NetworkCredential(gsUserName, gsPassword)
               request.UsePassive = True
               
               iX += 1
               ShowProgress(iProgressStep * iX, "Trasferimento del file " & FileName & "...")
               Dim fileContents As Byte()
               Using sourceStream As StreamReader = New StreamReader(gsHtmlPath & FileName)
                   sExt = Path.GetExtension(FileName)
                   If sExt = ".jpg" OrElse sExt = ".bmp" OrElse sExt = ".png" OrElse sExt = ".gif" Then
                       fileContents = File.ReadAllBytes(gsHtmlPath & FileName)
                   Else
                       fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())
                   End If
               End Using
               
               Try
                   Using requestStream As Stream = request.GetRequestStream()		'<=== QUI VA IN ERRORE
                       requestStream.Write(fileContents, 0, fileContents.Length)
                   End Using
               Catch
	               MessageBox.Show(ex.ToString)
               End Try
               
               iX += 1
               Using response As FtpWebResponse = CType(request.GetResponse(), FtpWebResponse)
                   If response.StatusCode = 226 Then
                       ShowProgress(iProgressStep * iX, " OK" & Constants.vbCrLf)
                   Else
                       ShowProgress(iProgressStep * iX, " Non riuscito" & Constants.vbCrLf)
                       Return False
                   End If
               End Using
           Next
           Return True
           
       Catch ex As Exception
           Log(ex)
           Return False
       End Try
   End Function

L'errore si verifica nella riga evidenziata e la MessageBox nel Catch mostra questo:


Ho cercato e trovato con Google diverse segnalazioni di problemi simili con Fastweb, ma nessuna con soluzione soddisfacente, anche perché, ripeto, Filezilla esegue tranquillamente l'upload.

Grazie a che cercherà di darmi una mano prima di consigliare al mio utente di cambiare nuovamente provider.

10 Risposte

  • Re: Upload via FTP con Fastweb

    Ciao, l'errore non si vede

  • Re: Upload via FTP con Fastweb

    Ora si dovrebbe vedere. Ciao

  • Re: Upload via FTP con Fastweb

    Hai provato a togliere la riga:

    request.UsePassive = True 

    ?

  • Re: Upload via FTP con Fastweb

    Bingo! Avevo provato a metterla a False e non cambiava niente. Togliendola funziona! 

    Grazie lele. Sai anche il perché?

  • Re: Upload via FTP con Fastweb

    Il valore predefinito è True. Strano

  • Re: Upload via FTP con Fastweb

    29/12/2024 - grumpy ha scritto:

    Bingo! Avevo provato a metterla a False e non cambiava niente. Togliendola funziona! 

    Grazie lele. Sai anche il perché?

    Alcuni server (vedi Fastweb) richiedono determinate parametri ed opzioni, ma non so come mai quella proprietà nel tuo caso ha fatto funzionare il tutto. 

    Comunque, anni fa era stato pubblicato su questa bella comunità un articolo per il caricamento ed il download dei file, qui https://www.iprogrammatori.it/articoli/microsoft-net-framework/csharp-gestione-ftp-con-dotnet-6 l'articolo.

    Buona programmazione.

  • Re: Upload via FTP con Fastweb

    Buongiorno. Ahimè sono costretto a tornare sull'argomento. Stamani, non del tutto convinto dalla conclusione di ieri, ho fatto altre prove e l'upload non funziona qualunque sia l'impostazione della proprietà UsePassive: né True, né False, né eliminandola.

    Inoltre ho un altro problema sullo stesso argomento: per i siti ospitati da alcuni provider (per es. Aruba) l' FTP con la classe FtpWebRequest non sono mai riuscito a farlo funzionare, mentre invece funzionava con l'uso delle API della libreria wininet.dll (InternetOpen, InternetConnect, FtpPutFile, ...). Naturalmente era una soluzione "old fashion", ma che mi aveva permesso di risolvere il problema. Ora non funziona più neanche con l'API: viene stabilita la connessione, viene avviata la sessione FTP, ma va in errore l'upload e, trattandosi di API, non si ottengono altre indicazioni.

    Grazie in anticipo per ogni suggerimento.

  • Re: Upload via FTP con Fastweb

    Infatti, mi sembrava strano, come ti dicevo.

    La questione Fastweb è molto complessa (e sembra che loro non possano/vogliano risolvere). Esistono dei problemi di traduzione di indirizzi e porte (NAT) fatte dai dispositivi Fastweb che danno questo tipo di problemi. Ma non tutti. Quindi la cosa potrebbe cambiare (un po' "a macchia di leoparto") a seconda della strada che il tuo collegamento prende attraverso la rete Fastweb e da dove esce verso Internet alla fine. Sembra che anche utilizzando un IP Pubblico (non so se tu disponi di tale indirizzo, da richiedere a Fastweb) ci siano stati problemi con FTP (che è comunque un protocollo vecchio e che utilizza un bel po' di risorse)-

    La questione Aruba dovrebbe essere invece circoscritta al fatto che loro utilizzano FTPS e non FTP ma andrebbero fatte delle prove.

    Comunque, prima di tutto, ti consiglio di controllare la configurazione del tuo PC, disattivato temporaneamente Firewall, Antivirus e Antimalware che magari interferiscono sull'uso delle (tante) porte che FTP può utilizzare (poi li riabiliti ma almeno devi sapere se danno problemi).

    Infine, ti consiglio di provare con il comando

    FTP

    da linea di comando (se non è installato lo puoi fare da Windows) per capire se la connessione avviene correttamente.

    Questo comando accetta degli script che potresti passargli semplicemente da codice in modo che faccia tutto lui.

  • Re: Upload via FTP con Fastweb

    Non mi risulterebbe che Aruba utilizzi TPS, comunque farò delle prove con una libreria che ho già usato in altre circostanze (Renci.SshNet).

    FTP è installato, mi documenterò sull'uso. Resta il fatto che Filezilla non fallisce mai, quindi il modo ci deve essere.

    Se non ci risentiamo Buon Anno!

  • Re: Upload via FTP con Fastweb

    Quando ti colleghi con Filezilla prova ad esaminare tutte le connessioni aperte dal processo con relativa coppia ip:poeta

    Buon Anno anche a te

Devi accedere o registrarti per scrivere nel forum
10 risposte