Я использую приведенный ниже код (должен быть .Net 2.0) для подключения на сервере UAT к клиентскому FTP-серверу для загрузки/выгрузки файлов. Мне нужно подключиться через порт 990, используя предоставленный ими самоподписанный сертификат. Я изменил правила брандмауэра, чтобы разрешить подключение к URI через порт 990 с нашего сервера UAT.
Однако (! :)) я получаю тайм-аут на линии
Stream requestStream = request.GetRequestStream();
Если я увеличиваю время ожидания, это не имеет значения.
Я посмотрел в Интернете, но не нашел ничего очевидного, что отсутствует в коде.
Если я использую CuteFTP для подключения к серверу UAT, то, естественно, он подключается нормально, и я могу вручную выполнять передачу файлов. Если я использую WireShark для просмотра сетевого трафика, он получает ответ от FTP-сервера, но никогда не выполняет рукопожатие для идентификатора пользователя и 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 - ID пользователя; FtpPassword = пароль пользователя; LocalFilePath — c:\temp\testFile.zip
У кого-нибудь есть идеи? Поскольку у некоторых людей, похоже, работает приведенный выше код. ТИА.