2009-08-31 8 views
4

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.

Répondre

0

Activez le traçage dans .Net et reprogrammez le problème, puis affichez le journal résultant et je vous dirai ce qui ne va pas. Il y a quelques problèmes connus dans FtpWebRequest dans .Net 2.0, donc vous pourriez en frapper un aussi mais il est impossible de dire juste avec le code que vous montrez. Les instructions pour allumer le traçage peuvent être trouvées ici: http://blogs.msdn.com/dgorti/archive/2005/09/18/471003.aspx

0

Je l'ai regardé à l'origine aussi, mais cela ne m'a pas beaucoup éclairé.

J'ai encore exécuté la trace et j'ai utilisé les paramètres SSL system.diagnostics dans la publication de Durgaprasad.

System.Net Verbose: 0 : [7016] WebRequest::Create(ftp://www.companyname.com:990/UAT/testFile.zip) 
System.Net Information: 0 : [7016] FtpWebRequest#48285313::.ctor(ftp://www.companyname.com:990/UAT/testFile.zip) 
System.Net Verbose: 0 : [7016] Exiting WebRequest::Create()  -> FtpWebRequest#48285313 
System.Net Verbose: 0 : [7016] FtpWebRequest#48285313::GetRequestStream() 
System.Net Information: 0 : [7016] FtpWebRequest#48285313::GetRequestStream(Method=STOR.) 
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Socket(InterNetwork#2) 
System.Net.Sockets Verbose: 0 : [7016] Exiting Socket#31914638::Socket() 
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Connect(131:990#-2083582714) 
System.Net.Sockets Verbose: 0 : [7016] Exiting Socket#31914638::Connect() 
System.Net Information: 0 : [7016] Associating FtpWebRequest#48285313 with FtpControlStream#18796293 
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Receive() 
System.Net.Sockets Error: 0 : [7016] Exception in the Socket#31914638::Receive - A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 
System.Net.Sockets Verbose: 0 : [7016] Exiting Socket#31914638::Receive() -> 0#0 
System.Net.Sockets Verbose: 0 : [7016] Socket#31914638::Dispose() 
System.Net Information: 0 : [7016] FtpWebRequest#48285313::(Releasing FTP connection#18796293.) 
System.Net Error: 0 : [7016] Exception in the FtpWebRequest#48285313::GetRequestStream - The operation has timed out. 
System.Net Error: 0 : [7016] at System.Net.FtpWebRequest.GetRequestStream() 
System.Net Verbose: 0 : [7016] Exiting FtpWebRequest#48285313::GetRequestStream()

En outre, (au moment précédent de l'exécution de ce) Je suis l'équipe de réseau pour exécuter Netmon et ils sous-entendu à partir du bas, que ce code était lié:


    TCP kulccstgweb02:2673  companyname.com:microsoft -ds ESTABLISHED 
    TCP kulccstgweb02:2678  companyname IP:ftps ESTABLISHED 
    TCP kulccstgweb02:sms-chat companyname IP:ftps ESTABLISHED 

BTW, la FTPPath - "ftp://111.222.333.444:990/UAT/testFile.zip" est actaully "ftp://www.companyname.com:990/UAT/testFile.zip" et est ensuite résolu à l'adresse IP. Mais je ne vois pas comment cela pourrait faire la différence.

+0

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? –

1

Étant sur le port 990, le serveur prend très probablement en charge implicit FTPS, pas le FTPS explicite plus standard. Il se peut que FTPS implicite ne soit pas supporté dans FtpWebRequest (je ne sais pas).

Si oui, jetez un oeil à edtFTPnet/PRO, qui supporte à la fois FTPS implicite et explicite, ainsi que SFTP.

+0

Pouvons-nous obtenir ceci vérifié? Je pense que cela pourrait être mon problème. – PeterX

+0

Également peut examiner: http://ftps.codeplex.com/ – PeterX

0

Lorsque vous téléchargez un fichier avec FTP je crée habituellement l'objet FtpWebRequest comme ceci:

string address = "ftp://www.companyname.com/UAT/" 
string fileName = "testFile.zip" 
UriBuilder uriBuilder = new UriBuilder(address); 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uriBuilder.ToString() + fileName); 

Donner cette essayer et voir ce qui arrive, je sais que cela fonctionne avec SSL et le port explicite 990.