Здравствуйте!
Стоит задача загрузить файл с FTP. Вопрос что быстрее: сначала проверить, есть ли этот файл на сайтах ( а их несколько,зеркалируют друг друга), или же сразу ломится загружать?В первом случае если файл отсутствует, переключаюсь на др. объект и его файл и далее по кругу. Во втором случае логика такая: сначала ломимся на один сайт, если несколько раз отлуп, ломимся на др. сайт и т.д. пока список возможных сайтов не исчерпается. И вот дилемма, как с одной стороны сделать надежнее, а с другой быстрее? Проверка файла перед загрузкой надежнее, но дольше. Загрузка сразу быстрее, но не надежна. И да, в большинстве случаев, проверяемые файлы будут на месте.
Код проверки файла на FTP:
public static Task<bool> CheckFtpFileAvaliabilityAsync(Uri uri)
{
Logger.Info(String.Format("Start validating file {0}...", uri));
var request = (FtpWebRequest)WebRequest.Create(uri);
request.Credentials = new NetworkCredential("", "");
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
request.KeepAlive = false;
request.Timeout = 3*1000;
return Task<bool>.Factory.FromAsync(request.BeginGetResponse, ia =>
{
try
{
var webResponse = request.EndGetResponse(ia);
return true;
}
catch(Exception e)
{
Logger.Warn(String.Format("Error validating file {0}", request.RequestUri), e);
return false;
}
}, request);
}
код загрузки файла:
public static Task<Tuple<string, Stream>> GetFtpFileAsync(Uri uri, bool useIoCallback = true)
{
if (uri == null) throw new ArgumentNullException("uri");
Logger.Info(String.Format("Start downloading file {0}...", uri));
var webRequest = (FtpWebRequest)WebRequest.Create(uri);
webRequest.Method = WebRequestMethods.Ftp.DownloadFile;
webRequest.AuthenticationLevel = AuthenticationLevel.None;
webRequest.Credentials = new NetworkCredential("", "");
webRequest.Timeout = 10000;
webRequest.KeepAlive = false;
string filename;
if (useIoCallback)
{
var uri1 = uri;
return Task<Tuple<string, Stream>>.Factory.FromAsync(webRequest.BeginGetResponse, (ia) =>
{
try
{
WebResponse webResponse = webRequest.EndGetResponse(ia);
var stream = webResponse.GetResponseStream();
filename = uri1.Segments.Last();
Logger.Info(String.Format("File {0} downloaded successfully!", uri));
return new Tuple<string, Stream>(filename, stream);
}
catch(Exception e)
{
Logger.Error(String.Format("Error downloading file {0}", webRequest.RequestUri), e);
throw;
}
}, webRequest);
}
filename = uri.Segments.Last();
return webRequest.GetResponseAsync()
.ContinueWith(t =>
{
Logger.Info(String.Format("File {0} downloaded successfully!", uri));
return new Tuple<string, Stream>(filename, t.Result.GetResponseStream());
}, TaskContinuationOptions.ExecuteSynchronously);
}
Заранее благодарю.