使用 FtpWebRequest 上传时超时 FTP
Timeout FTP upload with FtpWebRequest when it stalls
所以我有一个简单的 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
) 方程,所以它没有停止。这就是我被困的地方。
你的问题是$ftp.timeout = -1
。 -1
表示“无限”。参见 the Remarks section in FtpWebRequest.Timeout
property documentation
将其设置为一些合理的值。
所以我有一个简单的 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
) 方程,所以它没有停止。这就是我被困的地方。
你的问题是$ftp.timeout = -1
。 -1
表示“无限”。参见 the Remarks section in FtpWebRequest.Timeout
property documentation
将其设置为一些合理的值。