C#上传文件至FTP服务器时报System.Net.WebException无法连接远程服务器如何解决
问题排查步骤
- 核对FTP连接凭据:首先确认Hostinger后台给出的FTP地址、用户名、密码完全正确,你当前代码中使用的
zikria并非Hostinger默认的FTP用户名格式,Hostinger的FTP用户名通常为路径中显示的u323320256这类u开头的字符串,且FTP地址建议填写ftp://razidawakhana.com而非直接写IP,避免IP变更导致连接失败。 - 验证网络连通性:使用FileZilla等第三方FTP工具,填入相同的地址、端口、用户名、密码测试连接:如果工具也无法连接,说明是网络/权限问题,检查本地防火墙是否放行21端口、当前网络是否封禁FTP协议、Hostinger后台是否将你的当前IP加入FTP访问白名单;如果工具可以连接,说明是代码配置问题。
- 确认目标路径存在:先手动在Hostinger的文件管理器中确认
public_html/PDPix文件夹已创建,FTP不会自动创建不存在的父级文件夹,路径不存在也会触发连接/操作报错。
代码修复方案
你当前代码存在3个直接导致连接失败的配置问题:
- 未开启被动模式:
FtpWebRequest默认使用主动模式,而目前绝大多数商用FTP服务器(包括Hostinger)仅支持被动模式连接,需主动添加配置开启。 - 二进制文件读取逻辑错误:使用
StreamReader按UTF8编码读取所有类型文件,会导致图片、音频等二进制文件损坏,同时长度计算错误触发传输失败。 - 重复赋值冗余,且未正确释放资源,容易引发偶发连接异常。
修正后的完整代码如下:
//FTP Upload string ftpurl = "ftp://razidawakhana.com/home/u323320256/domains/razidawakhana.com/public_html"; string ftpusername = "u323320256"; // 替换为Hostinger后台给出的实际FTP用户名 string ftppassword = "Yamankatita1@"; // 替换为Hostinger后台给出的实际FTP密码 string PureFileName = new FileInfo(file_name).Name; string uploadUrl = String.Format("{0}/{1}/{2}", ftpurl, "PDPix", PureFileName); FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uploadUrl); request.Method = WebRequestMethods.Ftp.UploadFile; request.Credentials = new NetworkCredential(ftpusername, ftppassword); request.Proxy = null; request.KeepAlive = true; request.UseBinary = true; request.UsePassive = true; // 新增:开启被动模式,解决大部分连接失败问题 request.ContentLength = new FileInfo(_mediaFile.Path).Length; // 直接读取二进制流,避免文件损坏 byte[] fileContents = File.ReadAllBytes(_mediaFile.Path); using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(fileContents, 0, fileContents.Length); } using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) { Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); }
内容的提问来源于stack exchange,提问作者Zikria Rasul
相关产品推荐
相关产品推荐

