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

ASP.NET FTP上传文件时报错501 PASV not allowed问题求助

问题表现
  • ASP.NET项目使用FtpWebRequest对接FTP服务时,创建文件夹操作可正常完成
  • 执行文件上传逻辑,在request.GetResponse()代码行抛出异常,返回状态描述为501 error: PASV not allowed
  • 原有实现代码:
try
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + ftpFolder + isim + "/" + upc.PostedFile.FileName);
    request.Credentials = new NetworkCredential("username", "password");
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = false;
    // 将文件内容复制到请求流
    StreamReader sourceStream = new StreamReader("D:\\KTK\\" + upc.PostedFile.FileName);
    byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
    sourceStream.Close();
    request.ContentLength = fileContents.Length;
    request.Timeout = System.Threading.Timeout.Infinite;
    
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); // 该行代码触发错误
    Stream ftpStream = response.GetResponseStream();
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(fileContents, 0, fileContents.Length);
    requestStream.Close();
}
catch (WebException ex)
{
    FtpWebResponse response = (FtpWebResponse)ex.Response;
    var sonuc = response.StatusCode;
}
错误原因
  1. 核心报错原因:代码中显式设置request.UsePassive = true,强制使用FTP被动(PASV)模式传输,但当前对接的FTP服务器禁用了被动模式,仅支持主动(PORT)模式,因此服务端直接返回501错误拒绝请求。
  2. 代码存在额外逻辑错误,即便修复模式问题也无法正常上传:
    • 上传逻辑顺序颠倒:FTP上传需要先获取请求流写入文件内容,关闭请求流后再调用GetResponse()获取服务端执行结果,原代码先获取响应再写流不符合协议流程
    • 文件读取逻辑错误:使用StreamReader配合UTF8编码读取文件会破坏二进制文件(图片、压缩包、非文本格式文档等)的原始字节,导致上传后的文件损坏。
修复后代码
try
{
    string localFilePath = Path.Combine("D:\\KTK\\", upc.PostedFile.FileName);
    string ftpFilePath = ftp + ftpFolder + isim + "/" + upc.PostedFile.FileName;
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpFilePath);
    request.Credentials = new NetworkCredential("username", "password");
    request.Method = WebRequestMethods.Ftp.UploadFile;
    // 切换为主动模式,适配禁用PASV的FTP服务端
    request.UsePassive = false;
    request.UseBinary = true;
    request.KeepAlive = false;
    request.Timeout = System.Threading.Timeout.Infinite;

    // 直接读取文件原始字节,避免文本编码损坏二进制文件
    byte[] fileContents = File.ReadAllBytes(localFilePath);
    request.ContentLength = fileContents.Length;

    // 先写入请求流,再获取响应
    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileContents, 0, fileContents.Length);
    }

    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    {
        // 可在此处读取响应状态做上传成功后的业务处理
        var uploadStatus = response.StatusDescription;
    }
}
catch (WebException ex)
{
    FtpWebResponse response = (FtpWebResponse)ex.Response;
    var sonuc = response.StatusCode;
    // 异常处理逻辑
}

如果切换主动模式后出现连接超时问题,需要检查FTP服务端的主动模式端口开放范围,同时确认客户端部署环境的防火墙允许FTP服务端回连客户端的主动模式数据端口。

内容的提问来源于stack exchange,提问作者Betul Dundar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:24:16