2010-05-13 2 views
1

У меня проблема с загрузкой файлов на ftp-сервер. У меня есть несколько кнопок. Каждая кнопка загружает разные файлы в ftp. В первый раз, когда нажата кнопка, файл загружается успешно, но второй и более поздние попытки не выполняются. Это дает мне «Операция приурочена». Когда я закрываю сайт, а затем снова открываю его, я могу снова загрузить только один файл. Я уверен, что я могу переопределить файлы на ftp. Вот код:C# Загрузка файлов на ftp-сервер

protected void btn_export_OnClick(object sender, EventArgs e) 
{ 
    Stream stream = new MemoryStream(); 

    stream.Position = 0; 

    // fill the stream 

    bool res = this.UploadFile(stream, "test.csv", "dir"); 

    stream.Close(); 
} 

private bool UploadFile(Stream stream, string filename, string ftp_dir) 
{ 
     stream.Seek(0, SeekOrigin.Begin); 

     string uri = String.Format("ftp://{0}/{1}/{2}", "host", ftp_dir, filename); 

     try 
     { 
      FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 

      reqFTP.Credentials = new NetworkCredential("user", "pass"); 
      reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
      reqFTP.KeepAlive = false; 
      reqFTP.UseBinary = true; 
      reqFTP.UsePassive = true; 
      reqFTP.ContentLength = stream.Length; 
      reqFTP.EnableSsl = true; // it's FTPES type of ftp 

      int buffLen = 2048; 
      byte[] buff = new byte[buffLen]; 
      int contentLen; 

      try 
      { 
       Stream ftpStream = reqFTP.GetRequestStream(); 
       contentLen = stream.Read(buff, 0, buffLen); 
       while (contentLen != 0) 
       { 
        ftpStream.Write(buff, 0, contentLen); 
        contentLen = stream.Read(buff, 0, buffLen); 
       } 
       ftpStream.Flush(); 
       ftpStream.Close(); 
      } 
      catch (Exception exc) 
      { 
       this.lbl_error.Text = "Error:<br />" + exc.Message; 
       this.lbl_error.Visible = true; 

       return false; 
      } 
     } 
     catch (Exception exc) 
     { 
      this.lbl_error.Text = "Error:<br />" + exc.Message; 
      this.lbl_error.Visible = true; 

      return false; 
     } 

     return true;  
    } 

У кого-нибудь есть идеи, что может вызвать это странное поведение? Я думаю, что я точно закрываю все потоки. Может ли это быть связано с настройками ftp-сервера? Администратор сказал, что рукопожатие ftp никогда не происходило во второй раз.

+0

etarvt, на котором происходит тайм-аут, я предполагаю «Stream ftpStream = reqFTP.GetRequestStream();» ? Благодарю. –

ответ

2

начните с обертывания создания потока в статье использования.

 using(Stream stream = new MemoryStream()) 
     { 
      stream.Position = 0; 

      // fill the stream 

      bool res = this.UploadFile(stream, "test.csv", "dir"); 

     } 

Это позволит убедиться, что поток закрыт и что любые неуправляемые ресурсы расположены, происходит ли ошибка или нет

+0

Хорошо, спасибо за ответ, я попробую. – etarvt

+0

Возможно, это не источник вашей ошибки, но это хорошая практика. –

+0

Я попробовал. Но проблема все еще существует, действительно, возможно, это не источник. Я попытался с KeepAlive = true, но это ничего не меняет. – etarvt

1

Я использовал свой код, была такая же проблема, и установил ее.

После закрытия потока, вы должны прочитать reqFTP response по телефону GetResponse()затем закрыть ответ. Вот код, который исправляет проблему:

// Original code 
ftpStream.Flush(); 
ftpStream.Close(); 

// Here is the missing part that you have to add to fix the problem 
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
this.lbl_error.Text = "Response:<br />" + response.StatusDescription; 
response.Close(); 
reqFTP = null; 
this.lbl_error.Visible = true; 

Вы не должны показывать ответ, вы можете просто получить его и закрыть его, я его отображения только для справки.

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