2012-04-06 14 views
1

Windowsサービスでftpに問題があります。私はftpを通してファイルを送る仕事を予定しています。一度私はタイムアウト(周波数は週に1回、たぶん1ヶ月に1回)しており、Windowsサービスを再起動するまで続きます。スケジュールされたWindowsサービスで一貫したFTPタイムアウト

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(); 
      } 
     } 

thnxです。

+0

これはサーバー上の問題のようです...おそらく、他の要求を処理していて、最大数の接続に達しています...サーバー上のコントロールはありますか?例外がスローされたときに接続されたクライアントの数を確認できますか? – Gabber

+0

私は許可されていないため、サーバーにアクセスできないしかし、私が知っているように、それはこの仕事のためだけに使われる専用のサーバーです。 – Florjon

+0

あなたはなぜこれを理解しましたか?私は同じ問題を抱えています。私もサービスを再開する必要があります。 – user1932634

答えて

0

これをすべてループに入れないのはなぜですか?次に、エラーが発生した場合は、ループが戻って再び試行されます。

さらに、KeepAliveオプションをに設定すると、偽と表示されるのはなぜですか?

私はこれをしばらく使っていましたが、それをクラスに入れてみましたので、私はそれをよりよく見ることができましたが、それについては何もテストしませんでした。私のクラスは、バックグラウンドスレッドで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); 
    } 

} 
+0

これは、10分ごとにメソッド全体を実行する正常にスケジュールされたジョブです。 ...私は同じ論理です... – Florjon

関連する問題