You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:02