Тайм-аут загрузки FTP с помощью FtpWebRequest, когда он останавливается

Итак, у меня есть простой скрипт загрузки FTP, который перебирает набор файлов для загрузки. Цикл выбирает файл (отсортированный массив gci), загружает его, а затем переходит к следующему. Всего около 20 файлов. Цикл для одного файла заканчивается, когда либо я получаю сообщение об ошибке от сервера, либо когда я получаю подтверждение от сервера о том, что загрузка выполнена.

В последнее время этот сервер не давал мне ни того, ни другого, разрешая загрузку, но не подтверждая завершение файла. По сути, это означает, что сценарий просто застревает в этом цикле на несколько часов, пока я не отключу сценарий вручную.

Я надеюсь установить тайм-аут для основной команды загрузки, а именно:

$rs = $ftp.GetRequestStream()
$rs.Write($content, 0, $content.Length)

Кажется, что команда записи, хотя файл полностью записан на целевом FTP-сервере, никогда не получает ответа от FTP-сервера, а это означает, что он будет просто зависать, зависать и зависать.

То, что я надеюсь сделать, это добавить тайм-аут. Проблема здесь в том, что я не знаю способа проверить таймеры в середине выполнения задания на запись.

У меня есть выбор здесь?

Вот что я собираюсь сделать, но похоже (мое предположение), поскольку таймеры никогда не сравниваются друг с другом в середине задания на запись, цикл не завершится, пока задание re.write не завершится (что может быть никогда)

Любые идеи здесь?

$timeout = New-TimeSpan -Seconds 8
$timer = [System.Diagnostics.Stopwatch]::StartNew()
do {
    # create the FtpWebRequest and configure it
    $ftp = [System.Net.FtpWebRequest]::Create($ftpdestination)
    $ftp = [System.Net.FtpWebRequest]$ftp
    # build authentication and connection
    $ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
    $ftp.Credentials = new-object System.Net.NetworkCredential($username,$password)
    $ftp.UseBinary = $true
    $ftp.UsePassive = $true
    $ftp.timeout = -1
    # read in the file to upload as a byte array
    $content = [System.IO.File]::ReadAllBytes($sourcefile)
    $ftp.ContentLength = $content.Length
    # get the request stream, and write the bytes into it
    $rs = $ftp.GetRequestStream()
    $rs.Write($content, 0, $content.Length)
    $rs.Close()
    $rs.Dispose()
}
while ($timer.Elapsed -lt $timeout)

Итак, это то, что я использую, однако я понимаю, что проблема в том, что во время rs.write (куда уходит все мое время) он не переоценивает уравнение ($timer.Elapsed -lt $timeout), поэтому он не останавливается. Вот где я застрял.


person Daniel Williams    schedule 23.02.2021    source источник


Ответы (1)