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; }
错误原因
- 核心报错原因:代码中显式设置
request.UsePassive = true,强制使用FTP被动(PASV)模式传输,但当前对接的FTP服务器禁用了被动模式,仅支持主动(PORT)模式,因此服务端直接返回501错误拒绝请求。 - 代码存在额外逻辑错误,即便修复模式问题也无法正常上传:
- 上传逻辑顺序颠倒:FTP上传需要先获取请求流写入文件内容,关闭请求流后再调用
GetResponse()获取服务端执行结果,原代码先获取响应再写流不符合协议流程 - 文件读取逻辑错误:使用
StreamReader配合UTF8编码读取文件会破坏二进制文件(图片、压缩包、非文本格式文档等)的原始字节,导致上传后的文件损坏。
- 上传逻辑顺序颠倒:FTP上传需要先获取请求流写入文件内容,关闭请求流后再调用
修复后代码
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
相关产品推荐
相关产品推荐

