Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: .Net и ftp протокол Добавлено: 14.02.13 07:07  

Автор вопроса:  DrKillJoy
Доброго времени суток!

Имеется ftp сервер с которого нужно скачать файл. Задача вроде бы простая, но рабочий ПК "общается" через прокси. И вот это стало для меня непробиваемой стеной.
Вот код функции скачивания файла:

  
Private Sub Download(ByVal filePath As String, ByVal filename As String)
        Dim ftpServerIP As String = "адрес ftp сервера"
        Dim ftpUserID As String = "login"
        Dim ftpPassword As String = "pass"
        Dim fileInf As New IO.FileInfo(filename)
        Dim uri As String = "ftp://" + ftpServerIP + "/" + fileInf.Name



        Dim reqFTP As FtpWebRequest
        Try
            
            Dim proxyObject As New WebProxy("ftp://192.168.1.1:3127")

            Dim outputStream As FileStream = New FileStream(filePath + "\\" + filename, FileMode.Create)

            reqFTP = FtpWebRequest.Create(New Uri("ftp://" + ftpServerIP + "/" + filename))
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
            reqFTP.UseBinary = True
            reqFTP.Credentials = New NetworkCredential(ftpUserID, ftpPassword)
            reqFTP.Proxy = proxyObject

            Dim response As FtpWebResponse = reqFTP.GetResponse()

            'Stream(ftpStream = response.GetResponseStream())
            Dim ftpStream As IO.Stream = reqFTP.GetRequestStream()

            Dim cl As Long = response.ContentLength
            'Int(bufferSize = 2048)
            'Int(readCount)
            'Dim buffer As Byte()
            Dim bufferSize As Integer = 2048
            Dim buff(bufferSize) As Byte
            Dim readCount As Integer

            readCount = ftpStream.Read(buff, 0, bufferSize)
            While readCount > 0

                outputStream.Write(buff, 0, readCount)
                readCount = ftpStream.Read(buff, 0, bufferSize)
            End While

            ftpStream.Close()
            outputStream.Close()
            response.Close()

        Catch ex As Exception

            MessageBox.Show(ex.Message, "Download Error")
        End Try
    End Sub


При использовании http прокси, получаю ошибку, что сервер нарушил протокол.
А при использовании ftp прокси, получаю ошибку, что "класс ServicePointManager не поддерживает прокси со схемой FTP."

Любой совет, любая идея будет полезна! А то я уже второй день мучаюсь...

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 14.02.13 14:18
1. если есть то задай Credentials для твоего proxyObject
2. попробуй выставить reqFTP.UsePassive = True

Ответить

Номер ответа: 2
Автор ответа:
 DrKillJoy



Вопросов: 10
Ответов: 18
 Профиль | | #2 Добавлено: 15.02.13 06:57
Увы, но он все равно продолжает повторять: "класс ServicePointManager не поддерживает прокси со схемой FTP."
Может есть какие-то другие методы?

Я пробовал использовать WebClient. Но он отказывается работать с прокси. Выдает: "Исключение во время запроса WebClient."
  1. Dim wc As New WebClient
  2.         'proxyObject.Credentials = New NetworkCredential(ftpUserID, ftpPassword)
  3.  
  4.         'wc.Proxy = proxyObject
  5.         wc.Credentials = New NetworkCredential(ftpUserID, ftpPassword)
  6.         wc.DownloadFile(uri, "C:\Temp\1.rar")

Я перерыл почти весь интернет. Но так и не смог ничего сделать.
Ну должно же оно как-то работать!

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 15.02.13 10:58
proxyObject.Credentials = New NetworkCredential(ftpUserID, ftpPassword)

тут надо логин/пароль не для фтп, а для прокси.
либо, как вариант, на проксе закрыт стандартный фтпшный порт.. это надо решать с админом прокси

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 16.02.13 02:37
Интересно, мне одному кажется, что проблема именно в том, что написано в исключении - "ServicePointManager не поддерживает прокси со схемой FTP"?

Не удивлюсь если товарищ через обычный HTTP прокси пытается работать по FTP.

Ответить

Номер ответа: 5
Автор ответа:
 DrKillJoy



Вопросов: 10
Ответов: 18
 Профиль | | #5 Добавлено: 17.02.13 16:49
тут надо логин/пароль не для фтп, а для прокси.
А у него вроде нет, логина и пароля. Так как FarManager нормально подключается без них...
либо, как вариант, на проксе закрыт стандартный фтпшный порт.. это надо решать с админом прокси
А что это даст? И можно ли через http прокси работать с ftp?
Не удивлюсь если товарищ через обычный HTTP прокси пытается работать по FTP.
Нет. Это ведь ftp прокси:
  1. Dim proxyObject As New WebProxy("ftp://192.168.1.1:3127")

Я уже замучился воевать, с этим прокси...( У кого, еще есть идеи?

Ответить

Номер ответа: 6
Автор ответа:
 DrKillJoy



Вопросов: 10
Ответов: 18
 Профиль | | #6 Добавлено: 19.02.13 10:19
Я наконец разобрался со своей проблемой. Большое спасибо, откликнувшимся! Проблема, увы, была не в коде. Просто на сервере была выставлена такая политика безопасности. Пришлось с админом договариваться.

  1. Imports System.Text
  2. Imports System.Net
  3. Imports System.IO
  4. Public Class FTPClient
  5.     Private UserID As String
  6.     Private Password As String
  7.     Public DownloadFileSize As Integer
  8.     Public DownloadSize As Integer
  9.  
  10.     Public Sub New(ByVal UserID As String, ByVal Password As String)
  11.         Me.UserID = UserID
  12.         Me.Password = Password
  13.     End Sub
  14.  
  15.     Public Sub uploadFile(ByVal URI As String, ByVal UploadFileName As String, ByVal LocalPath As String, ByVal LocalFileName As String, Optional ByVal FTPUserID As String = "", Optional ByVal FTPPassword As String = "")
  16.         Dim completePath = LocalPath + "/" + LocalFileName
  17.         Dim fileInf As FileInfo = New FileInfo(completePath)
  18.  
  19.         If UploadFileName = "" Then
  20.             UploadFileName = LocalFileName
  21.         End If
  22.  
  23.         If FTPUserID = "" Then
  24.             FTPUserID = Me.UserID
  25.         End If
  26.  
  27.         If FTPPassword = "" Then
  28.             FTPPassword = Me.Password
  29.         End If
  30.  
  31.         Dim MyURI As String = URI + "/" + UploadFileName
  32.  
  33.  
  34.  
  35.         Dim reqFTP As FtpWebRequest
  36.  
  37.  
  38.         Dim buffLength As Integer = 2048
  39.         Dim buff(buffLength) As Byte
  40.         Dim contentLen As Integer
  41.  
  42.         Dim response As FtpWebResponse = Nothing
  43.  
  44.         Dim fs As FileStream = fileInf.OpenRead()
  45.         Dim strm As Stream = Nothing
  46.  
  47.         Try
  48.             reqFTP = CType(FtpWebRequest.Create(New Uri(MyURI)), FtpWebRequest)
  49.             reqFTP.Credentials = New NetworkCredential(FTPUserID, FTPPassword)
  50.             reqFTP.KeepAlive = False
  51.             reqFTP.Method = WebRequestMethods.Ftp.UploadFile
  52.             reqFTP.UseBinary = True
  53.             reqFTP.ContentLength = fileInf.Length
  54.             reqFTP.UsePassive = True
  55.  
  56.             response = CType(reqFTP.GetResponse(), FtpWebResponse)
  57.  
  58.             strm = reqFTP.GetRequestStream()
  59.             contentLen = fs.Read(buff, 0, buffLength)
  60.  
  61.             While (contentLen <> 0)
  62.                 strm.Write(buff, 0, contentLen)
  63.                 contentLen = fs.Read(buff, 0, buffLength)
  64.             End While
  65.         Finally
  66.             strm.Close()
  67.             fs.Close()
  68.             response.Close()
  69.         End Try
  70.     End Sub
  71.  
  72.  
  73.     Public Function GetFileList(ByVal URI As String, Optional ByVal FTPUserID As String = "", Optional ByVal FTPPassword As String = "") As String()
  74.         Dim downloadFiles() As String
  75.         Dim result As StringBuilder = New StringBuilder()
  76.         Dim reqFTP As FtpWebRequest = Nothing
  77.         Dim response As WebResponse = Nothing
  78.         Dim reader As StreamReader = Nothing
  79.  
  80.         If FTPUserID = "" Then
  81.             FTPUserID = Me.UserID
  82.         End If
  83.  
  84.         If FTPPassword = "" Then
  85.             FTPPassword = Me.Password
  86.         End If
  87.  
  88.         Try
  89.             reqFTP = CType(FtpWebRequest.Create(URI), FtpWebRequest)
  90.             reqFTP.UseBinary = True
  91.             reqFTP.Credentials = New NetworkCredential(FTPUserID, FTPPassword)
  92.             reqFTP.Method = WebRequestMethods.Ftp.ListDirectory
  93.             response = reqFTP.GetResponse()
  94.  
  95.             reader = New StreamReader(response.GetResponseStream())
  96.  
  97.             Dim line As String = reader.ReadLine()
  98.  
  99.             While Not line Is Nothing
  100.                 result.Append(line)
  101.                 result.Append("\n")
  102.                 line = reader.ReadLine()
  103.             End While
  104.  
  105.             result.Remove(result.ToString().LastIndexOf("\n"), 1)
  106.  
  107.             downloadFiles = result.ToString().Split("\n")
  108.         Catch ex As Exception
  109.             downloadFiles = Nothing
  110.         Finally
  111.             reader.Close()
  112.             response.Close()
  113.         End Try
  114.  
  115.         Return downloadFiles
  116.     End Function
  117.  
  118.  
  119.     Public Sub downloadFile(ByVal Uri As String, ByVal ToDownLoadFileName As String, ByVal LocalPath As String, Optional ByVal LocalFileName As String = "", Optional ByVal FTPUserID As String = "", Optional ByVal FTPPassword As String = "", Optional ByVal CountDownloadFile As Integer = 1, Optional ByVal ThisDownloadFile As Integer = 1)
  120.         Dim result As StringBuilder = New StringBuilder()
  121.         Dim reqFTP As FtpWebRequest = Nothing
  122.         Dim response As FtpWebResponse = Nothing
  123.         Dim reader As StreamReader = Nothing
  124.  
  125.         Dim ftpStream As Stream = Nothing
  126.         Dim outputStream As FileStream = Nothing
  127.  
  128.         If FTPUserID = "" Then
  129.             FTPUserID = Me.UserID
  130.         End If
  131.  
  132.         If FTPPassword = "" Then
  133.             FTPPassword = Me.Password
  134.         End If
  135.  
  136.         If LocalFileName = "" Then
  137.             LocalFileName = ToDownLoadFileName
  138.         End If
  139.  
  140.         Try
  141.  
  142.             outputStream = New FileStream(LocalPath + "\\" + LocalFileName, FileMode.Create)
  143.             reqFTP = CType(FtpWebRequest.Create(Uri + "/" + ToDownLoadFileName), FtpWebRequest)
  144.             reqFTP.ConnectionGroupName = "MyGroup"
  145.             reqFTP.UsePassive = True
  146.             reqFTP.UseBinary = True
  147.        
  148.             reqFTP.Credentials = New NetworkCredential(FTPUserID, FTPPassword)
  149.  
  150.             reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
  151.  
  152.             response = CType(reqFTP.GetResponse(), FtpWebResponse)
  153.             ftpStream = response.GetResponseStream()
  154.  
  155.             Dim cl As Long = response.ContentLength
  156.             DownloadFileSize = response.ContentLength
  157.             Dim bufferSize As Integer = 2048
  158.  
  159.             Dim readCount As Integer
  160.             Dim buffer(bufferSize) As Byte
  161.             readCount = ftpStream.Read(buffer, 0, bufferSize)
  162.  
  163.             While readCount > 0
  164.                 outputStream.Write(buffer, 0, readCount)
  165.                 readCount = ftpStream.Read(buffer, 0, bufferSize)
  166.                 Application.DoEvents()
  167.                 Dim o As New FileInfo(LocalPath + "\\" + LocalFileName)
  168.                 Main.Text = DownloadFileSize / 1024 & " = " & o.Length / 1024 & "   " & "Скачано файлов: " & ThisDownloadFile & " из " & CountDownloadFile
  169.                 DownloadSize = o.Length
  170.             End While
  171.  
  172.         Finally
  173.             ftpStream.Close()
  174.             outputStream.Close()
  175.             response.Close()
  176.         End Try
  177.     End Sub


Вот работоспособный класс, который я использую. Это на тот случай, если кому-то понадобиться.


Еще остался вопрос. Теперь все работает. Но время от времени появляется ошибка "TimeOut", что время ожидания операции истекло. Мне непонятно, как обрабатывать такую ошибку, и перезапустить скачивание (например)? Ошибка появляется на этой строке: "response = CType(reqFTP.GetResponse(), FtpWebResponse)". Подскажите пожалуйста, а то из-за этого все программа "висит".

Ответить

Номер ответа: 7
Автор ответа:
 SHDZ



ICQ: 209382104 

Вопросов: 39
Ответов: 244
 Профиль | | #7 Добавлено: 13.05.13 23:32
  1. using System.Net;

  1.  
  2. using (WebClient wc = new WebClient())
  3.             {
  4.                 wc.Proxy = new WebProxy();// Твой прокси
  5.                 string strURL = "http://xxxxxxxxxxxxxxxxxxxxxxxx";
  6.  
  7.                 //Download only when the webclient is not busy.
  8.                 if (!wc.IsBusy)
  9.                 {
  10.                     string rtn_msg = string.Empty;
  11.                     try
  12.                     {
  13.                         rtn_msg = wc.DownloadString(new Uri(strURL));
  14.                         return rtn_msg;
  15.                     }
  16.                     catch (WebException ex)
  17.                     {
  18.                         Console.Write(ex.Message);
  19.                         return false;
  20.                     }
  21.                     catch (Exception ex)
  22.                     {
  23.                         Console.Write(ex.Message);
  24.                         return false;
  25.                     }
  26.                 }
  27.                 else
  28.                 {
  29.                     System.Windows.Forms.MessageBox.Show("Busy please try again");
  30.                     return false;
  31.                 }
  32.             }

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам