2015-01-29 8 views
1

Я использую этот код для подключения моего сервера и загрузки файлов. Он работает нормально.После включения безопасности в сеансе FTP, получения 500 Синтаксическая ошибка, команда unrecognized

public void downloadFile(object args) 
{ 
    writeStream = null; 
    response = null; 
    reader = null; 
    int dataLength = 0; 

    try 
    { 
     Array argArray = new object[3]; 
     argArray = (Array)args; 
     ProgressBar progressBar1 = (ProgressBar)argArray.GetValue(0); 
     Label lbProgress = (Label)argArray.GetValue(1); 

     FTPInfo ftpInfo = (FTPInfo)argArray.GetValue(2); 
     string ipAddress = ftpInfo.IpAddress; 

     string path = ftpInfo.Path; 
     string fileName = ftpInfo.FileName; 

     path = Regex.Replace(path, "_.", "_e"); 
     fileName = Regex.Replace(fileName, "_.", "_e"); 

     string uri = null; 
     if (path.Equals("")) 
     { 
      uri = ipAddress + fileName; 
     } 
     else 
     { 
      uri = ipAddress + path + "/" + fileName; 
     } 
     string[] temp = ipAddress.Split('/'); 
     string ip = "mchmultimedia.com"; 
     string userName = ftpInfo.UserName; 
     string password = ftpInfo.Password; 
     downloadedData = new byte[0]; 
     ftp = new FTPClass(path); 
     ftp.FtpServer = ip; 
     ftp.FtpUsername = userName; 
     ftp.FtpPassword = password; 
     ftp.FtpLogin(); 
     dataLength = (int)ftp.GetFileSize(fileName); 
     Logger.LogDebugMessage("DataLength :" + dataLength.ToString()); 
     ftp.CloseConnection(); 
     FtpWebRequest request = FtpWebRequest.Create(uri) as FtpWebRequest; 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 
     request.Credentials = new NetworkCredential(userName, password); 
     request.UsePassive = true; 
     request.UseBinary = true; 
     request.KeepAlive = false; 

     //Set up progress bar 
     UpdateProgressBarValue(progressBar1, 0); 
     SetProgressBarMaxValue(progressBar1, dataLength); 

     response = request.GetResponse() as FtpWebResponse; 
     reader = response.GetResponseStream(); 

     if (!Directory.Exists(GlobalClass.ZIPPED_FOLDER)) 
      Directory.CreateDirectory(GlobalClass.ZIPPED_FOLDER); 
     writeStream = new FileStream(GlobalClass.ZIPPED_FOLDER + "\\" + fileName, FileMode.Create); 
     int Length = 2048; 
     Byte[] buffer = new Byte[Length]; 
     int bytesRead = 0; 
     Logger.LogDebugMessage("Before while :" + dataLength.ToString()); 
     while (true) 
     { 
      Application.DoEvents(); 

      bytesRead = reader.Read(buffer, 0, buffer.Length); 
      if (bytesRead == 0) 
      { 
       try 
       { 
        try 
        { 
         reader.Close(); 
        } 
        catch (Exception ex) 
        { 
         Logger.LogErrorMessage("reader close if bytesRead ==00", ex); 

        } 

        try 
        { 
         response.Close(); 
        } 
        catch (Exception ex) 
        { 
         Logger.LogErrorMessage("response close if bytesRead ==00", ex); 
        } 

        try 
        { 
         writeStream.Close(); 
        } 
        catch (Exception ex) 
        { 
         Logger.LogErrorMessage("writeStream close if bytesRead ==00", ex); 
        } 

       } 
       catch (Exception ex) 
       { 

       } 
       UpdateProgressBarValue(progressBar1, progressBar1.Maximum); 
       Application.DoEvents(); 
       break; 
      } 
      else 
      { 
       writeStream.Write(buffer, 0, bytesRead); 

       if (progressBar1.Value + bytesRead <= progressBar1.Maximum) 
       { 
        totalBytesRead = progressBar1.Value + bytesRead; 
        int percentage = (int)((double)totalBytesRead/dataLength * 100); 
        UpdateProgressBarValue(progressBar1, totalBytesRead); 

        SetText(lbProgress, "File download " + percentage.ToString() + " % completed"); 
        if (percentage == 100) 
        { 
         if (totalBytesRead == dataLength) 
         { 
          try 
          { 
           try 
           { 
            reader.Close(); 
           } 
           catch (Exception ex) 
           { 
            Logger.LogErrorMessage("reader close if percentage==100", ex); 
           } 

           try 
           { 
            response.Close(); 
           } 
           catch (Exception ex) 
           { 
            Logger.LogErrorMessage("response close if percentage==100", ex); 
           } 

           try 
           { 
            writeStream.Close(); 
           } 
           catch (Exception ex) 
           { 
            Logger.LogErrorMessage("writeStream close if percentage==100", ex); 
           } 

          } 
          catch (Exception ex) 
          { 

          } 
          SetText(lbProgress, "File download successfully completed,Please wait..."); 
          unzipFile(fileName); 
         } 

        } 

        RefreshProgressBar(progressBar1); 
        Application.DoEvents(); 
       } 

      } 
     } 
    } 
    catch (System.Threading.ThreadAbortException ex) 
    { 
     if (thread != null) 
     { 
      thread.Abort(); 
     } 
     Logger.LogErrorMessage("ThreadAbortException", ex); 

    } 
    catch (Exception ex) 
    { 
     Logger.LogErrorMessage("Exception there was an error connecting", ex); 
     Logger.ReportBug("There was an error connecting to the FTP Server.", ex); 
    } 
    finally 
    { 
     try 
     { 
      try 
      { 
       reader.Close(); 
      } 
      catch (Exception ex) 
      { 
       Logger.LogErrorMessage("read finally", ex); 
      } 

      try 
      { 
       response.Close(); 
      } 
      catch (Exception ex) 
      { 
       Logger.LogErrorMessage("resonse finally", ex); 
      } 

      try 
      { 
       writeStream.Close(); 
      } 
      catch (Exception ex) 
      { 
       Logger.LogErrorMessage("writeStream finally", ex); 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
} 

Но клиенту необходимо, чтобы он был защищен FTP. Так что я попытался, установив

request.EnableSsl = true; 

, как указано в Differences between SFTP and "FTP over SSH"

И бросает:

The remote server returned an error: (500) Syntax error, command unrecognized.

+0

Так требует ли клиент использовать безопасный FTP (в соответствии с вашим текстом и используемым ядром) или SFTP (тег, который вы использовали)? Вы действительно понимаете разницу, когда читаете [вопрос, который вы связали с] (http://stackoverflow.com/questions/440463/differences-between-sftp-and-ftp-over-ssh)? Ошибка 500 указывает, что сервер не понимает команду AUTH TLS, так что она не поддерживает FTP через TLS. Может быть, вы должны использовать SFTP? Есть ли порт, указанный в 'ftpInfo.IpAddress'? –

+0

Я немного смущен. Я использовал пакет SSH.NET Nuget, и он работал хорошо, но я просто наткнулся на эту ссылку, в которой говорится, что вы можете включить безопасность, просто включив SSl. Поэтому я пробовал это. – Vivekh

ответ

1

Вы, очевидно, необходимо использовать протокол SFTP.

Класс FtpWebRequest не поддерживает протокол SFTP. В стандартных библиотеках .NET поддержка SFTP отсутствует. См. SFTP Libraries for .NET.

Ваш текущий код пытается подключиться с FTP через протокол TLS к FTP-серверу. Это еще один способ обеспечить сеанс передачи файлов. Но этот конкретный FTP-сервер не поддерживает его (следовательно, ошибка «Синтаксическая ошибка 500, команда непризнанная» ошибка).

Поэтому вы должны переписать свой код для использования протокола SFTP.

Это, к сожалению, совершенно другой код.

+0

Эй, я хотел бы спросить, есть ли какое-либо влияние на время загрузки файла из обычного ftp (встроенного .NET), и с использованием SSH.NET или любых других сторонних SFTP-сервисов. – Vivekh

+0

SFTP может быть медленнее. 1) Из-за шифрования, если обе стороны передачи имеют ограниченную мощность ЦП. 2) Протоколы SFTP (и базовые SSH) ориентированы на пакеты. Если их реализация не идеальна (опять же с обеих сторон), емкость соединения с/от сервера не может быть использована максимально. Ни одна из этих проблем не связана с протоколом FTP. Протокол FTP, наоборот, менее эффективен, чем SFTP, при работе с большим количеством небольших файлов. –