PowerShell使用System.Net.WebClient上传文件后FTP连接不关闭如何解决
PowerShell 调用WebClient上传FTP后连接无法关闭的解决方案
根因
WebClient底层依赖FtpWebRequest实现FTP请求,该类默认开启连接复用机制,KeepAlive属性默认值为true,即使上层WebClient对象被释放,底层FTP连接仍然会被.NET的连接池保留用于后续同站点请求复用,不会立刻主动关闭。
解决方案
方案1:改用FtpWebRequest显式控制连接行为(最可靠)
直接使用底层FtpWebRequest实现上传逻辑,显式关闭连接复用,上传完成后连接会直接断开:
function Upload-File() { Param ( [string] $user, [string] $password, [string] $srceFileName, [string] $destFileName ) $ftpRequest = [System.Net.FtpWebRequest]::Create($destFileName) $ftpRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $ftpRequest.Credentials = New-Object System.Net.NetworkCredential($user, $password) # 核心配置:禁用连接复用,上传完成直接断开连接 $ftpRequest.KeepAlive = $false $ftpRequest.UseBinary = $true $localFileStream = [System.IO.File]::OpenRead((Resolve-Path ".\$srceFileName").Path) $ftpRequestStream = $ftpRequest.GetRequestStream() $localFileStream.CopyTo($ftpRequestStream) $localFileStream.Close() $ftpRequestStream.Close() $response = $ftpRequest.GetResponse() $response.Close() }
方案2:保留WebClient实现,强制清理连接
如果不需要修改原有上传逻辑,可以在$client.Dispose()后新增代码强制关闭目标FTP站点的所有空闲连接:
$client.Dispose() # 新增以下内容 $ftpUri = New-Object System.Uri($destFileName) $servicePoint = [System.Net.ServicePointManager]::FindServicePoint($ftpUri) $servicePoint.CloseConnectionGroup("")
补充说明
- 若需批量上传同FTP站点的大量文件,不建议每次上传都关闭连接,会显著降低传输效率,可以等所有文件全部上传完成后统一执行一次连接清理即可。
- 可以调整全局空闲连接超时时间,缩短连接残留时长,单位为毫秒,默认值为100000(100秒),示例:
# 设置空闲连接10秒后自动释放 [System.Net.ServicePointManager]::MaxServicePointIdleTime = 10000
内容的提问来源于stack exchange,提问作者Dag Sondre Hansen
相关产品推荐
相关产品推荐

