Bonjour,

Je suis en train de me battre depuis plusieurs heures sur une application console qui doit communiquer avec un serveur FTP.

Le pitch : Je regarde dans un répertoire du FTP, je boucle sur tous les dossiers et pour chaque dossier je boucle sur tous les fichiers qu'il contient.

Avec mon serveur de test (perso) aucun souci, mais avec le serveur de prod gros problème : Environ 1 requête sur 2 provoque une erreur 501 (erreur de syntaxe dans les paramètres ou les arguments).

Je ne vois pas comment une erreur peut arriver si je change juste l'adresse du FTP. Pourquoi une requête sur deux alors que ce sont des méthodes qui génèrent mes requêtes ?

Voici à quoi ressemble le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Public Sub grab()
	'On récupère les numéros de fax
	Dim File As String
	Dim MyArray As Array = Nothing
	Dim MyFiles As Array = Nothing
 
	Dim MonClient As New PostAvenue.Client
	Dim SQL As System.Data.SqlClient.SqlCommand
	Dim RS As System.Data.SqlClient.SqlDataReader
	Dim oConnectionInsert As System.Data.SqlClient.SqlConnection
 
	'On parcoure les dossiers présents sur le FTP
	oConnectionInsert = New System.Data.SqlClient.SqlConnection()
	oConnectionInsert.ConnectionString = System.Configuration.ConfigurationSettings.AppSettings("POSTAVENUEConnectionString").ToString
	oConnectionInsert.Open()
 
	MyArray = listeDossiers("ftp://" & Client.Hostname & "/FAX_IN/", Client.Username, Client.Password)
 
	For Each SDA As String In MyArray
 
		'On ne prend pas les dossier '.' et '..'
		If Not SDA.EndsWith(".") Then
 
			MyFiles = listeFichiers("ftp://" & Client.Hostname & "/DOSSIER_IN/" & SDA & "/", Client.Username, Client.Password)
 
			If Not (MyFiles Is Nothing) Then
 
				SQL = oConnectionInsert.CreateCommand()
				SQL.CommandText = "Select SDA_ClientID FROM TBL_SDA WHERE SDA_NoSDA='" & SDA & "'"
				RS = SQL.ExecuteReader()
 
				If RS.HasRows Then
 
					RS.Read()
					MonClient.getFromID(Integer.Parse(RS("SDA_ClientID").ToString))
					RS.Close()
 
					For Each File In MyFiles
						'On traite le fichier
						Console.Write("> Info: Copie du fichier " & File & ":")
						downloadFichier("ftp://" & Client.Hostname & "/DOSSIER_IN/" & SDA & "/" & File, System.Environment.CurrentDirectory & "/tmp", Client.Username, Client.Password)
						Console.WriteLine(" OK")
 
						'On créer les dossiers si on en a besoin
						Console.Write("> Info: Création des répertoires (" & MonClient.GUID & "):")
						creerRepertoire("ftp://00.00.00.00/WEBSITE/clients/" & MonClient.GUID & "/in", "admin", "root")
						Console.WriteLine(" OK")
 
						'On l'upload, qu'il soit dispo sur le site.
						Console.Write("> Info: Upload du fichier :")
						uploadFichier(System.Environment.CurrentDirectory & "/tmp", "ftp://84.37.14.68/POSTAVENUE/SITE/clients/" & MonClient.GUID & "/in/" & File, "admin", "root")
						Console.WriteLine(" OK")
 
						Console.Write("> Info: Suppression du fichier temporaire :")
						System.IO.File.Delete(System.Environment.CurrentDirectory & "/tmp")
						Console.WriteLine(" OK")
 
						Console.Write("> Info: Suppression du fichier distant :")
						removeFichier("ftp://" & Client.Hostname & "/DOSSIER_IN/" & SDA & "/" & File, Client.Username, Client.Password)
						Console.WriteLine(" OK")
 
						Console.Write("> Info: Ajout des infos dans la base :")
 
						Dim SQLInsert As System.Data.SqlClient.SqlCommand = oConnectionInsert.CreateCommand()
						SQLInsert.CommandText = "INSERT INTO TBL_SDAIN (SDAIN_ClientID, SDAIN_Fichier, SDAIN_Emeteur) VALUES (" & MonClient.ID & ", '" & File & "', '123')"
 
						If SQLInsert.ExecuteNonQuery() > 0 Then
							Console.WriteLine(" OK")
						Else
							Console.WriteLine(" Echec")
						End If
 
 
						Console.WriteLine()
					Next
				Else
					RS.Close()
					Console.WriteLine("> Erreur: Impossible de trouver le client associé !")
				End If
			End If
		Else
			Console.WriteLine(".")
		End If
	Next
End Sub
Et la methode ou à lieu l'erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    Public Function listeFichiers(ByVal serveurCible As String, ByVal identifiant As String, ByVal motDePasse As String) As Array
        Dim monResponseStream As Stream = Nothing
        Dim monStreamReader As StreamReader = Nothing
        Dim monResultat As Array = Nothing
        ' Instanciation de deux Uri qui vont contenir les chemins source et destination
        Dim monUriServeur As New System.Uri(serveurCible)
        ' Vérification de la validité de l'Uri du fichier sur le serveur FTP
        If Not (monUriServeur.Scheme = Uri.UriSchemeFtp) Then
            'MessageBox.Show("L'Uri du serveur FTP n'est pas valide", "Une erreur est surevnue", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            'Si Uri non valide, arrêt du listage
            Return monResultat
            Exit Function
        End If
        Try
            ' Création de la requête de récupération de la liste des fichiers
            Dim maRequeteListe As FtpWebRequest = CType(WebRequest.Create(monUriServeur), FtpWebRequest)
            maRequeteListe.Method = WebRequestMethods.Ftp.ListDirectoryDetails
            ' Vérification de la présence des identifiants d'un compte, si aucun alors
            ' la connexion se fait en mode anonyme
            If Not identifiant.Length = 0 Then
                Dim monCompteFtp As New NetworkCredential(identifiant, motDePasse)
                maRequeteListe.Credentials = monCompteFtp
            End If
            'Console.WriteLine(maRequeteListe.GetRequestStream.ToString)
 
            ' Récupération de la liste de fichiers
            Dim maResponseListe As FtpWebResponse = CType(maRequeteListe.GetResponse, FtpWebResponse)
 
            ' Placement du flux provenant du serveur dans un streamreader
            monStreamReader = New StreamReader(maResponseListe.GetResponseStream, Encoding.Default)
            ' Lecture du stream reader
            Dim listeBrute As String = monStreamReader.ReadToEnd
            ' Découpage de chaque fichier dans la liste concaténée de fichiers
            Dim separateur() As String = {Environment.NewLine} ' -> retour chariot
            ' Découpage et récupération des noms de fichiers
            Dim tableauListe() As String = listeBrute.Split(separateur, StringSplitOptions.RemoveEmptyEntries)
            Dim listeFinale As New List(Of String)
            ' Lecture du tableau et tri des noms de fichiers
            Dim i As Integer = 0
            While i < tableauListe.Length
                ' Les répertoires se différencient des fichiers par le fait que  
                ' la chaîne que l'on récupère commence par un "d".
                If Not tableauListe(i).StartsWith("d") Then
                    ' On place les noms de fichiers dans une liste
                    listeFinale.Add(tableauListe(i).Substring(tableauListe(i).LastIndexOf(" ") + 1))
                End If
                i += 1
            End While
            monResultat = listeFinale.ToArray
            'MessageBox.Show("Liste terminée")
            ' Gestion des exceptions
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        Finally
            ' Fermeture des différents flux utilisés
            If monResponseStream IsNot Nothing Then
                monResponseStream.Close()
            End If
            If monStreamReader IsNot Nothing Then
                monStreamReader.Close()
            End If
        End Try
        Return monResultat
    End Function
Je suis tenté de dire que l'erreur vient du serveur, car le code fonctionne sen test, mais je ne suis pas sur... Quelqu'un pourrait m'éclairer ?

++
A