Согласованный тайм-аут FTP в запланированной службе Windows

У меня проблема с ftp в службе Windows. Я запланировал задание по отправке файлов через ftp. Время от времени у меня бывает тайм-аут (частота один раз в неделю или, может быть, один раз в месяц), и он продолжается до тех пор, пока я не перезапущу свою службу Windows.

System.Net.WebException: время операции истекло.

Я обрабатываю исключение и, наконец, закрываю все открытые сеансы ftp.

try
        {
            string uri = String.Format("ftp://{0}/{1}/{2}", server, download, file);
            Uri serverUri = new Uri(uri);
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            {
                return;
            }
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            reqFTP.Credentials = new NetworkCredential(username, password);
            reqFTP.KeepAlive = false;
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.EnableSsl = false;
            reqFTP.Proxy = null;
            reqFTP.UsePassive = true;
            reqFTP.Timeout = Settings.Default.TimeOut;
            reqFTP.ReadWriteTimeout = Settings.Default.TimeOut;

            response = (FtpWebResponse)reqFTP.GetResponse();
            responseStream = response.GetResponseStream();

            using (FileStream writeStream = new FileStream(path + file, FileMode.Create))
            {
                int Length = 10240;
                Byte[] buffer = new Byte[Length];
                int bytesRead = responseStream.Read(buffer, 0, Length);
                while (bytesRead > 0)
                {
                    writeStream.Write(buffer, 0, bytesRead);
                    bytesRead = responseStream.Read(buffer, 0, Length);
                }
            }

            response.Close();
        }
        catch (WebException wEx)
        {
            LogDatabase.WriteLog("Download File", wEx.ToString(), "Download File");
        }
        finally
        {
            if (response != null)
            {
                response.Close();
            }
            if (responseStream != null)
            {
                responseStream.Close();
            }
        }

Любые идеи ?

спасибо заранее.


person Florjon    schedule 06.04.2012    source источник
comment
Это похоже на проблему на сервере ... возможно, он занят обслуживанием других запросов и достиг максимального количества подключений ... есть ли у вас какой-либо контроль на сервере? Вы можете проверить количество подключенных клиентов при возникновении исключения?   -  person Gabber    schedule 06.04.2012
comment
у меня нет доступа к серверу, потому что мне это не разрешено. Но насколько я знаю, это выделенный сервер, который используется только для этой работы.   -  person Florjon    schedule 06.04.2012
comment
Вы когда-нибудь понимали, почему? У меня такая же проблема. Мне тоже нужно перезапустить службу.   -  person user1932634    schedule 04.06.2014


Ответы (1)


Почему ты не можешь собрать все это в цикл? Затем, если у вас есть ошибка, цикл просто возвращается и пытается снова.

Кроме того, почему вы установили для параметра KeepAlive значение false?

Я немного поигрался с этим и поместил его в класс, чтобы лучше разглядеть, но не тестировал его. Мой класс выполняет вызов FTP в фоновом потоке, что, безусловно, нужно сделать, если вы вообще хотите иметь возможность общаться с ним.

Я, конечно, не даю никаких гарантий, что это будет работать без каких-либо сбоев!

class FtpRequests {

  private const int BUF_SIZE = 10240;
  private const string PASSWORD = "password";
  private const string USERNAME = "username";
  private const string SERVER = "yourserver.com";
  private string path;

  public FtpRequests() {
    Cancel = false;
    path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
  }

  public bool Cancel { get; set; }

  public bool Complete { get; set; }

  public Thread Thread1 { get; set; }

  public int Timeout { get; set; }

  public int ReadWriteTimeout { get; set; }

  public void StartFtpDownload(string download, string file) {
    string objString = string.Format("{0};{1}", download, file);
    Thread1 = new Thread(startFtpThread);
    Thread1.Name = string.Format("{0} download", file);
    Thread1.IsBackground = true;
    Thread1.Start(objString);
  }

  private void startFtpThread(object obj) {
    Complete = false;
    string objString = obj.ToString();
    string[] split = objString.Split(';');
    string download = split[0];
    string file = split[1];
    do {
      try {
        string uri = String.Format("ftp://{0}/{1}/{2}", SERVER, download, file);
        Uri serverUri = new Uri(uri);
        if (serverUri.Scheme != Uri.UriSchemeFtp) {
          Cancel = true;
          return;
        }
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        reqFTP.Credentials = new NetworkCredential(USERNAME, PASSWORD);
        reqFTP.KeepAlive = true;
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
        reqFTP.EnableSsl = false;
        reqFTP.Proxy = null;
        reqFTP.UsePassive = true;
        reqFTP.Timeout = Timeout;
        reqFTP.ReadWriteTimeout = ReadWriteTimeout;
        using (FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse()) {
          using (Stream responseStream = response.GetResponseStream()) {
            using (FileStream writeStream = new FileStream(path + file, FileMode.Create)) {
              Byte[] buffer = new Byte[BUF_SIZE];
              int bytesRead = responseStream.Read(buffer, 0, BUF_SIZE);
              while (0 < bytesRead) {
                writeStream.Write(buffer, 0, bytesRead);
                bytesRead = responseStream.Read(buffer, 0, BUF_SIZE);
              }
            }
            responseStream.Close();
          }
          response.Close();
          Complete = true;
        }
      } catch (WebException wEx) {
        LogDatabase.WriteLog("Download File", wEx.ToString(), "Download File");
      }
    } while (!Cancel && !Complete);
  }

}
person jp2code    schedule 06.04.2012
comment
это хорошо спланированное задание, которое запускает весь метод каждые 10 минут. ... у меня та же логика ... - person Florjon; 06.04.2012