Как создать FtpWebRequest через SSL?

Я пытаюсь создать соединение с удаленным сервером для загрузки файла, соединение должно быть через SSL, и у меня есть только несколько портов, доступных на маршрутизаторах с обеих сторон. Кажется, что соединение установлено успешно, однако время ожидания Stream requestStream = request.GetRequestStream(); истекло. После проверки журнала трассировки следующая строка кажется подозрительной:

System.Net Information: 0 : [7144] FtpControlStream#33675143 - Created connection from [myIP]:64230 to [theirIP]:990.

Хотя он говорит, что соединение было создано, я знаю, что порт 64230 не открыт, и я предполагаю, что именно поэтому он не работает. Так можно ли указать, с какого порта создавать локальное соединение? Или может я что-то еще упускаю?

[РЕДАКТИРОВАТЬ]:

Я настроил FTP-сайт в IIS на своем локальном компьютере для тестирования, чтобы увидеть, что может пойти не так, но у меня возникла та же проблема. Что интересно, я могу подключиться практически к любому порту с теми же настройками, кроме 990. Теперь я могу исключить брандмауэр, похоже, это не проблема. Есть еще предположения? Вот пример кода:

string fileName = "file.pdf";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://[host]:990/file.pdf");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.EnableSsl = true;
request.UsePassive = true;
ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertifications;
request.Credentials = new NetworkCredential("[host]|[username]", "[password]");
Stream requestStream = request.GetRequestStream();
FileStream stream = File.OpenRead(fileName);
const int bufferLength = 1024;
byte[] buffer = new byte[bufferLength];
int count = 0;
int readBytes = 0;
do
{
    readBytes = stream.Read(buffer, 0, bufferLength);
    requestStream.Write(buffer, 0, readBytes);
    count += readBytes;
}
while (readBytes != 0);

stream.Close();
requestStream.Close();

Console.WriteLine("Upload complete");

person Shagglez    schedule 27.04.2011    source источник
comment
Это не должно иметь значения — и ваш брандмауэр, и удаленный брандмауэр будут фильтровать на основе порта, к которому вы подключаетесь, а не автоматически назначенного номера порта, с которого вы подключаетесь. Затем FTP создает второе соединение для передачи данных: это точно тоже открытый порт? В каком направлении идет передача данных, т.е. вы используете активный/пассивный?   -  person Rup    schedule 27.04.2011
comment
Я пробовал и активный, и пассивный, результаты идентичны. Загрузка FileZilla работает в пассивном режиме, поэтому, если бы я мог понять, что они делают, а я нет, я должен был бы заставить его работать.   -  person Shagglez    schedule 27.04.2011


Ответы (1)


Разве ваша строка подключения не должна быть:

ftps://[host]:990/file.pdf

Также я знаю, что вы сказали, что можете исключить брандмауэр, но с FTPS часто возникает головная боль, возможно, этот ответ об ошибке сервера может быть полезен:

Какие порты брандмауэра мне нужно открыть при использовании FTPS?

person Ira Rainey    schedule 28.04.2011
comment
ftps не является протоколом, который принимает конструктор Uri, достаточно установить для EnableSsl значение true. Также я совершенно уверен, что это не брандмауэр, потому что в настоящее время он отключен. - person Shagglez; 28.04.2011