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 :
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
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
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 ?
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
++
A
Partager