2012-01-25 7 views
1

Я пытаюсь скопировать файлы с помощью webrequest внутри WCF. Мне нужны предложения. Есть ли лучшие способы сделать это?Скопировать файлы с использованием FTP в C#

С какими проблемами безопасности я буду сталкиваться здесь?

Могу ли я сделать это внутри WCF или сделать его отдельным лучше?

public void InsertOccured(string Name) 
{ 
    // Console.WriteLine("Insert Occured",Name); 
    Console.WriteLine("Insert Occured, {0}", Name); 
    // FTP request to download the file from FTP Location 
    FtpWebRequest reqFTP; 

    try 
    { 
     string FilePath; 
     string FileName = Name; 

     //use Switch statement to identify the ftpServerIP 

     FileStream outputStream = new FileStream(FilePath + "\\" + FileName, FileMode.Create); 
     reqFTP= (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpserverIp + FileName)); 
     reqFTP.Method= WebRequestMethods.Ftp.DownloadFile; 
     reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
     FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
     Stream ftpStream = response.GetResponseStream(); 
     long cl = response.ContentLength; 
     int bufferSize = 2048; 
     int readCount; 
     byte[] buffer = new byte[bufferSize]; 
     readCount = ftpStream.Read(buffer, 0, bufferSize); 
     while (readCount > 0) 
     { 
      outputStream.Write(buffer, 0, readCount); 
      readCount = ftpStream.Read(buffer, 0, bufferSize); 
     } 

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

    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
} 
+0

Что вы пытаетесь достичь? – Lloyd

+0

Потоки и объекты ответа все должны находиться в блоках 'using'. –

+0

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

ответ

1

всегда лучше, чтобы сделать его отдельно, но я не знаю много о проблемах безопасности с WCF, однако вы можете использовать этот код для чтения responseStream, вы должны использовать «с помощью», чтобы иметь структуру управлять утилизацию потока правильно

try 
     { 
      byte[] buffer = new byte[4155]; 
      byte[] newBuffer; 
      int readSize = 0; 
      FileStream outputStream = new FileStream(FilePath + "\\" + FileName, FileMode.Create); 
      int i = 0; 
      using (Stream input = response.GetResponseStream()) 
      { 
        readSize = input.Read(buffer, 0, buffer.Length); 
        if (readSize > 0) 
        { 
         newBuffer = new byte[readSize]; 
         Array.Copy(buffer, newBuffer, readSize); 
         outputStream.Write(newBuffer.ToArray(), 0, readSize); 
        } 
       outputStream.Close(); 
      } 
+0

Спасибо всем за ваш ценный ввод – Usher

+0

спасибо за ваш код, я пытался использовать ваш код. newBuffer не показывает свойства для ToArray(). (newBuffer.ToArray()). Он выдает исключение. «System.Array» не содержит определения для «ToArray.Do, я пропустил кое-что здесь – Usher

+0

, вы можете использовать его без преобразования вызывая ToArray(), в идеале, он не должен давать ошибку, если newBuffer имеет тип byte []. Сообщите мне, если u stil prblm с ним. – DotNetUser

4

Использование FTP не является самым надежным. Имя пользователя, пароли и все данные отправляются в поле «Очистить». Если вас беспокоит безопасность, вы должны рассмотреть возможность использования SFTP.

+0

или FTPS (SSL + FTP) –

+0

@ Скотт, это то, что тоже мое беспокойство, но идете с идеей Бена Фойгта. – Usher

Смежные вопросы