PowerShell System.Net.WebClient 从不关闭 ftp 连接
PowerShell System.Net.WebClient never closes ftp connection
我正在尝试使用 PowerShell 上传(长)排队文件列表,使用 System.Net.WebClient
和 UploadFile
函数。这工作正常,但在我们上传文件后,ftp-连接永远不会关闭,无论是在 WebClient 对象实例超出范围时,还是在脚本完成后。该函数如下所示:
function Upload-File() {
Param (
[string] $user,
[string] $password,
[string] $srceFileName,
[string] $destFileName
)
# Set up FTP-client
$client = New-Object System.Net.WebClient
$client.Credentials = New-Object System.Net.NetworkCredential($user, $password)
$client.UploadFile($destFileName, ".$srceFileName")
$client.Dispose()
}
我能找到的所有信息都表明当 $client
超出范围时连接应该自动关闭,但这显然没有发生。
知道如何强制关闭连接吗?
(这是遗留系统的一部分,现在我坚持使用 ftp,因此无法切换到另一个协议。)
对于其他 运行 遇到此问题的人,解决方案是使用 FtpWebRequest
而不是 WebClient
并设置 KeepAlive = $false
。下面的函数将上传然后立即终止连接。
function Upload-File() {
Param (
[string] $user,
[string] $password,
[string] $srceFileName,
[string] $destFileName
)
$request = [Net.WebRequest]::Create($destFileName)
$request.KeepAlive = $false
$request.Credentials =
New-Object System.Net.NetworkCredential($user, $password)
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$fileStream = [System.IO.File]::OpenRead(".$srceFileName")
$ftpStream = $request.GetRequestStream()
$fileStream.CopyTo($ftpStream)
$ftpStream.Dispose()
$fileStream.Dispose()
}
This post pointed me in the right direction.
我正在尝试使用 PowerShell 上传(长)排队文件列表,使用 System.Net.WebClient
和 UploadFile
函数。这工作正常,但在我们上传文件后,ftp-连接永远不会关闭,无论是在 WebClient 对象实例超出范围时,还是在脚本完成后。该函数如下所示:
function Upload-File() {
Param (
[string] $user,
[string] $password,
[string] $srceFileName,
[string] $destFileName
)
# Set up FTP-client
$client = New-Object System.Net.WebClient
$client.Credentials = New-Object System.Net.NetworkCredential($user, $password)
$client.UploadFile($destFileName, ".$srceFileName")
$client.Dispose()
}
我能找到的所有信息都表明当 $client
超出范围时连接应该自动关闭,但这显然没有发生。
知道如何强制关闭连接吗?
(这是遗留系统的一部分,现在我坚持使用 ftp,因此无法切换到另一个协议。)
对于其他 运行 遇到此问题的人,解决方案是使用 FtpWebRequest
而不是 WebClient
并设置 KeepAlive = $false
。下面的函数将上传然后立即终止连接。
function Upload-File() {
Param (
[string] $user,
[string] $password,
[string] $srceFileName,
[string] $destFileName
)
$request = [Net.WebRequest]::Create($destFileName)
$request.KeepAlive = $false
$request.Credentials =
New-Object System.Net.NetworkCredential($user, $password)
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$fileStream = [System.IO.File]::OpenRead(".$srceFileName")
$ftpStream = $request.GetRequestStream()
$fileStream.CopyTo($ftpStream)
$ftpStream.Dispose()
$fileStream.Dispose()
}
This post pointed me in the right direction.