J'utilise le code ci-dessous (doit être .Net 2.0) pour se connecter sur un serveur UAT à un serveur FTP client pour monter/descendre des fichiers. Je dois me connecter au port 990, en utilisant un certificat auto-signé fourni par eux. J'ai modifié les règles de pare-feu pour permettre la connexion à l'URI sur le port 990 de notre serveur UAT.FTP sur SSL pour C#
Cependant (! :)) Je reçois un délai d'attente sur la ligne
Stream requestStream = request.GetRequestStream();
Si j'augmente le temps de délai, il ne fait aucune différence.
J'ai jeté un coup d'oeil sur le web mais je n'ai trouvé rien d'évident qui manque dans le code.
Si j'utilise CuteFTP pour se connecter sur le serveur UAT alors, naturellement, il se connecte bien et je peux effectuer manuellement les transferts de fichiers. Si j'utilise WireShark pour regarder le trafic réseau, il obtient une réponse du serveur FTP mais ne fait jamais la poignée de main pour l'ID utilisateur et pwd (pour le code), mais via CuteFTP tout le trafic réseau est correct.
Je force le retour de True où il vérifie le certificat.
private void button4_Click(object sender, EventArgs e)
{
try
{
string completeFTPPath = ConfigurationManager.AppSettings["FTPPath"];
// get the object used to communicate with the server.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(completeFTPPath);
request.EnableSsl = true;
request.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["FtpUserName"], ConfigurationManager.AppSettings["FtpPassword"]);
request.Method = WebRequestMethods.Ftp.UploadFile;
ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertifications;
// read file into byte array
StreamReader sourceStream = new StreamReader(ConfigurationManager.AppSettings["LocalFilePath"]);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
// send bytes to server
MessageBox.Show("GetRequestStream() start");
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
MessageBox.Show("GetRequestStream() end");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
MessageBox.Show("Response status: " + response.StatusDescription);
}
catch (WebException we)
{
MessageBox.Show(we.Message);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{ return true; }
par exemple. FTPPath - ftp://111.222.333.444:990/UAT/testFile.zip; FtpUserName - ID utilisateur; FtpPassword = userPwd; LocalFilePath - c: \ temp \ testFile.zip
Des idées? Comme certaines personnes semblent avoir le code ci-dessus qui fonctionne. TIA.
Si le nom d'hôte "111.222.333.444" n'est pas le nom "www.company.com", la correspondance du nom du certificat échouera. Cela pourrait-il être votre problème? –