Я создал скрипт для загрузки файлов с FTP-сервера. Скрипт работает хорошо со всеми протестированными серверами, за исключением одного. Для этого сервера я могу получить список каталогов, но при попытке загрузить файл не удается и выдает ошибку «421 Сервис недоступен, закрытие управляющего соединения». Ниже приведен код, который я использую для загрузки файла.
function Get-FtpFile
{
Param ([string]$fileUrl, $credentials, [string]$destination)
try
{
$FTPRequest = [System.Net.FtpWebRequest]::Create($fileUrl)
if ($credentials)
{
$FTPRequest.Credentials = $credentials
}
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$FTPRequest.UseBinary = $true
$FTPRequest.UsePassive = $true
# Send the ftp request
$FTPResponse = $FTPRequest.GetResponse()
# Get a download stream from the server response
$ResponseStream = $FTPResponse.GetResponseStream()
# Create the target file on the local system and the download buffer
$LocalFile = New-Object IO.FileStream ($destination,[IO.FileMode]::Create)
[byte[]]$ReadBuffer = New-Object byte[] 1024
# Loop through the download
do {
$ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)
$LocalFile.Write($ReadBuffer,0,$ReadLength)
}
while ($ReadLength -ne 0)
$ResponseStream.Close()
$ReadBuffer.clear()
$LocalFile.Close()
$FTPResponse.Close()
}
catch [Net.WebException]
{
return "Unable to download because: $($_.exception)"
}
}
Я могу загружать файлы с этого сервера, используя Windows File Explorer FTP, поэтому я не думаю, что это проблема с сервером сам.
Одна интересная вещь, которую я заметил во время тестирования, заключается в том, что когда сервер возвращает список каталогов, каждое имя файла включает в себя завершающий NULL. Я попытался загрузить файлы, включая и не включая этот завершающий NULL, обе попытки приводят к одному и тому же коду ошибки.
Кто-нибудь видел подобную ошибку раньше? Или кто-нибудь знает о различиях в том, как Windows File Explorer использует FTP по сравнению со сценарием PowerShell, который я перечислил выше?