FTP через SSL для C # - PullRequest
       43

FTP через SSL для C #

4 голосов
/ 31 августа 2009

Я использую приведенный ниже код (должен быть .Net 2.0) для подключения на сервере UAT к клиентскому FTP-серверу для загрузки / выгрузки файлов. Мне нужно подключиться через порт 990, используя самоподписанный сертификат, предоставленный ими. Я изменил правила брандмауэра, чтобы разрешить подключение к URI через порт 990 с нашего сервера UAT.

Однако (! :)) я получаю тайм-аут на линии

 Stream requestStream = request.GetRequestStream();

Если я увеличу время ожидания, это не изменится.

Я посмотрел в Интернете, но не нашел ничего очевидного, чего не хватает в коде.

Если я использую CuteFTP для подключения к серверу UAT, то, естественно, он подключается нормально, и я могу вручную передавать файлы. Если я использую WireShark для просмотра сетевого трафика, он получает ответ от FTP-сервера, но никогда не выполняет квитирование для ID пользователя и PWD (для кода), но через CuteFTP весь сетевой трафик в порядке.

Я принудительно возвращаю True, где он проверяет сертификат.


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; }

например. FTPPath - ftp: //111.222.333.444: 990 / UAT / testFile.zip ; FtpUserName - идентификатор пользователя; FtpPassword = userPwd; LocalFilePath - c: \ temp \ testFile.zip

У кого-нибудь есть идеи? Поскольку некоторые люди, кажется, имеют приведенный выше код, работает. ТИА.

Ответы [ 5 ]

1 голос
/ 07 сентября 2009

Попробуйте библиотеку EnterpriseDT .

1 голос
/ 07 сентября 2009

Находясь на порту 990, сервер, скорее всего, поддерживает неявный FTPS , а не более стандартный явный FTPS. Возможно, неявный FTPS не поддерживается в FtpWebRequest (я не знаю).

Если это так, взгляните на edtFTPnet / PRO , который поддерживает неявные и явные FTPS, а также SFTP.

0 голосов
/ 13 октября 2009

При загрузке файла с FTP я обычно создаю объект FtpWebRequest, например:

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

Попробуйте и посмотрите, что произойдет, я знаю, что это работает с явным SSL и портом 990.

0 голосов
/ 31 августа 2009

Первоначально я тоже смотрел на это, но он не пролил много света на меня.

Я только что снова запустил трассировку и использовал настройки SSL system.diagnostics в сообщении Дургапрасада.

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() 

Кроме того, (в предыдущий раз при запуске этого) я заставил сетевую команду запустить Netmon, и они подразумевали, что это было связано с кодом:


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

Кстати, FTPPath - " ftp: //111.222.333.444: 990 / UAT / testFile.zip " является действительным " ftp: //www.companyname.com: 990 / UAT /testFile.zip ", а затем преобразуется в IP. Но я не понимаю, как это может изменить ситуацию.

0 голосов
/ 31 августа 2009

Включите трассировку в .Net и перепишите проблему, затем опубликуйте полученный журнал, и я расскажу вам, что происходит не так. Есть несколько известных проблем в FtpWebRequest в .Net 2.0, поэтому вы можете использовать одну из них, но это невозможно сказать просто с помощью кода, который вы показываете. Инструкции по включению трассировки можно найти здесь: http://blogs.msdn.com/dgorti/archive/2005/09/18/471003.aspx

...