Загрузить\Выгрузить файл(ы) на FTP в пассивном режиме - Visual Basic .NET

Формулировка задачи:

Всем привет! Столкнулся с проблемой, обмена с FTP (на IIS) с помощью Net.FtpWebRequest в пассивном режиме. При попытке загрузить список каталогов, получить или отправить на фтп данные сообщает об ошибке: 227 Entering Passive Mode (ххх,ххх,ххх,ххх,224,18). Использование свойства UsePassive = true, также не помогает, ошибка повторяется. Если свойство установить в UsePassive = false, сообщит о следующей ошибке: "500 PORT/EPRT (Active Mode/Extended Active Mode) is not supported. Use PASV/EPSV instead of this" Примеры кода перепробовал несколько, в т.ч. и из готовых решений, ошибка одна и таже. Поиск по форуму, да и гуглу особо результата не дал. Да я понимаю, что при пассивном подключении нужно получить порт от сервера, но вот как его получить и подключиться к серверу никак не пойму. Пароли и прочее все верно. Подключение через браузер и тоталкомандер успешные. Вот один из примеров кода на котором я тестировал (значение свойства UsePassive = true, дописывал самостоятельно):
Public Class FTP
    '-------------------------[BroCode]--------------------------
    '----------------------------FTP-----------------------------
    Private _credentials As System.Net.NetworkCredential
    Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
        setCredentials(_FTPUser, _FTPPass)
    End Sub
    Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String)
        Dim _FileInfo As New System.IO.FileInfo(_FileName)
        Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)
        _FtpWebRequest.Credentials = _credentials
        _FtpWebRequest.KeepAlive = False
        _FtpWebRequest.Timeout = 20000
        _FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
        _FtpWebRequest.UseBinary = True
        _FtpWebRequest.ContentLength = _FileInfo.Length
        _FtpWebRequest.UsePassive = True
        Dim buffLength As Integer = 2048
        Dim buff(buffLength - 1) As Byte
        Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()
        Try
            Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()
            Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)
            Do While contentLen <> 0
                _Stream.Write(buff, 0, contentLen)
                contentLen = _FileStream.Read(buff, 0, buffLength)
            Loop
            _Stream.Close()
            _Stream.Dispose()
            _FileStream.Close()
            _FileStream.Dispose()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
        Try
            Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
            _request.KeepAlive = False
            _request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
            _request.Credentials = _credentials
            Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
            Dim responseStream As System.IO.Stream = _response.GetResponseStream()
            Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
            'responseStream.CopyT(fs)
            responseStream.Close()
            _response.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
        Dim ret As New List(Of String)
        Try
            Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
            _request.KeepAlive = False
            _request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
            _request.Credentials = _credentials
            Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
            Dim responseStream As System.IO.Stream = _response.GetResponseStream()
            Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
            Dim FileData As String = _reader.ReadToEnd
            Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
            For Each l As String In Lines
                ret.Add(l)
            Next
            _reader.Close()
            _response.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Return ret
    End Function
 
    Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
        _credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
    End Sub
End Class  Dim ftp As New FTP("server", "pass")
 
        ftp.UploadFile("localfile", "hostfile")
 
        ftp.DownloadFile("localfile", "hostfile")
 
        Dim directory As List(Of String) = ftp.GetDirectory("ftp://hostdir/")
        ListBox1.Items.Clear()
        For Each item As String In directory
            ListBox1.Items.Add(item)
        Next
Пожалуйста, помоги разобраться и как осуществить подключение к серверу в пассивном режиме, может даже пример кода у кого завалялся. Заранее спасибо!

Код к задаче: «Загрузить\Выгрузить файл(ы) на FTP в пассивном режиме - Visual Basic .NET»

textual
Dim ftp As New FTP("login", "password")
 Dim directory As List(Of String) = ftp.GetDirectory("ftp://site.ru/")
        ListBox1.Items.Clear()
        For Each item As String In directory
            ListBox1.Items.Add(item)
        Next

11   голосов, оценка 3.818 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы
Для поиска решения или похожих решений вы можете воспользоваться "Поиском по сайту" или "Поиском по разделу"
Поиск по сайту