c# - Retry mechanism for downloading files -
i have created function find files on ftp folder.
public static list<string> getfilelist(networkcredential credential, string ftpsite, string ftpfolder, string extension) { string lsoutput = ""; list<string> files = new list<string>(); //fetch ls ftpwebrequest request = (ftpwebrequest)webrequest.create(@"ftp://" + ftpsite + ftpfolder); request.credentials = credential; request.usebinary = true; request.enablessl = true; request.method = webrequestmethods.ftp.listdirectory; ftpwebresponse response = null; response = (ftpwebresponse)request.getresponse(); stream responsestream = response.getresponsestream(); streamreader reader = new streamreader(responsestream); lsoutput = reader.readtoend(); reader.close(); response.close(); preparelog("ls output while finding files:"); preparelog(lsoutput); //parse ls string[] lsoutputlines = lsoutput.trim().split(new string[] { environment.newline }, stringsplitoptions.removeemptyentries); foreach (string lsoutputline in lsoutputlines) files.add(lsoutputline); //filter files files = files.where(f => f.tolower().endswith(extension.tolower())).tolist(); preparelogandemail("total " + extension.tolower() + " files found: " + files.count, logmessagetype.simple); return files; }
exception handling done @ place function being called. problem ftp faces issues(like timeout) , have rerun program.
i have been asked add 3 times retry mechanism , here did retry once.
public static list<string> getfilelist(networkcredential credential, string ftpsite, string ftpfolder, string extension) { string lsoutput = ""; list<string> files = new list<string>(); try { //fetch ls ftpwebrequest request = (ftpwebrequest)webrequest.create(@"ftp://" + ftpsite + ftpfolder); request.credentials = credential; request.usebinary = true; request.enablessl = true; request.method = webrequestmethods.ftp.listdirectory; ftpwebresponse response = null; response = (ftpwebresponse)request.getresponse(); stream responsestream = response.getresponsestream(); streamreader reader = new streamreader(responsestream); lsoutput = reader.readtoend(); reader.close(); response.close(); preparelog("ls output while finding files:"); preparelog(lsoutput); } catch (exception ex) { preparelogandemail("first attempt failed: details: " + ex.message, logmessagetype.attemptfailed); preparelogandemail("second attempt started" + ex.message, logmessagetype.simple); //fetch ls ftpwebrequest request = (ftpwebrequest)webrequest.create(@"ftp://" + ftpsite + ftpfolder); request.credentials = credential; request.usebinary = true; request.enablessl = true; request.method = webrequestmethods.ftp.listdirectory; ftpwebresponse response = null; response = (ftpwebresponse)request.getresponse(); stream responsestream = response.getresponsestream(); streamreader reader = new streamreader(responsestream); lsoutput = reader.readtoend(); reader.close(); response.close(); preparelog("ls output while finding files(second attempt):"); preparelog(lsoutput); } //parse ls string[] lsoutputlines = lsoutput.trim().split(new string[] { environment.newline }, stringsplitoptions.removeemptyentries); foreach (string lsoutputline in lsoutputlines) files.add(lsoutputline); //filter files files = files.where(f => f.tolower().endswith(extension.tolower())).tolist(); preparelogandemail("total " + extension.tolower() + " files found: " + files.count, logmessagetype.simple); return files; }
now if have add 2 more tries, need sort of daiys chaining or there other cleaner option available ?
i go retry loop, below
you notice make use of bolean flag out of successfull download, or retries count terminate.
i go far changing last section check if download successfull, , notify user if not, maybe logging error messages.
public static list<string> getfilelist(networkcredential credential, string ftpsite, string ftpfolder, string extension) { list<string> files = new list<string>(); int retries = 0; int maxretries = 5; bool downloaded = false; string lsoutput = ""; while (!downloaded && retries < maxretries) { try { lsoutput = ""; //fetch ls ftpwebrequest request = (ftpwebrequest) webrequest.create(@"ftp://" + ftpsite + ftpfolder); request.credentials = credential; request.usebinary = true; request.enablessl = true; request.method = webrequestmethods.ftp.listdirectory; ftpwebresponse response = null; response = (ftpwebresponse) request.getresponse(); stream responsestream = response.getresponsestream(); streamreader reader = new streamreader(responsestream); lsoutput = reader.readtoend(); reader.close(); response.close(); preparelog("ls output while finding files:"); preparelog(lsoutput); downloaded = true; } catch (exception ex) { retries++; } } if (downloaded) { //parse ls string[] lsoutputlines = lsoutput.trim().split(new string[] {environment.newline}, stringsplitoptions.removeemptyentries); foreach (string lsoutputline in lsoutputlines) files.add(lsoutputline); //filter files files = files.where(f => f.tolower().endswith(extension.tolower())).tolist(); preparelogandemail("total " + extension.tolower() + " files found: " + files.count, logmessagetype.simple); return files; } else { preparelogandemail("failed download file", logmessagetype.simple); return null; } }
Comments
Post a Comment