【问题标题】:C# FtpWebRequest - special character "§" in passwordC# FtpWebRequest - 密码中的特殊字符“§”
【发布时间】:2025-12-12 11:20:03
【问题描述】:

我在使用密码中带有特殊字符“§”的 FtpWebRequest 时遇到问题。 代码如下所示:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://ftphost"));
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
reqFTP.UsePassive = true;
reqFTP.EnableSsl = false;
reqFTP.Timeout = 60000;
reqFTP.UseBinary = false;
reqFTP.Credentials = new NetworkCredential("user", "pa§");

FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

GetResponse() 方法失败并显示“530 用户无法登录”。 使用 FileZilla 可以登录。

我使用 Wireshark 跟踪网络流量并注意到以下内容:

  • FileZilla 将密码转换为“pa\302\247”,尝试登录但失败。之后 FileZilla 使用密码“pa\247”重试连接成功。
  • FtpWebRequest 将密码转换为“pa\302\247”,尝试登录也失败并抛出异常。

如何强制 FtpWebRequest 将密码转换为“pa\247”而不是“pa\302\247”?

谢谢。

【问题讨论】:

    标签: c# ftp passwords character ftpwebrequest


    【解决方案1】:

    这似乎是一个编码问题。 § 字符在 UTF-8 中是 \302\247,在 ISO-8859 中是 \247 -1。根据您提供的信息,这告诉我您的请求是使用字符集 UTF-8 发送的,并且服务器需要 ISO-8859-1。您有两个选择,如果您可以访问 ftp 服务器,您应该能够更改默认字符集。否则,您需要使用字符集 ISO-8859-1 发送您的 ftp 请求。我没有时间测试它,但你可以试一下下面的代码(注意添加的标题):

    FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://ftphost"));
    reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
    reqFTP.UsePassive = true;
    reqFTP.EnableSsl = false;
    reqFTP.Timeout = 60000;
    reqFTP.UseBinary = false;
    reqFTP.Credentials = new NetworkCredential("user", "pa§");
    reqFTP.Headers.Add(HttpRequestHeader.ContentType, "text/plain; charset=\"ISO-8859-1\"");
    
    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
    

    【讨论】:

    • 谢谢。您提供的代码抛出此异常:“InvalidOperationException:此集合包含响应标头,不能包含指定的请求标头。”我尝试添加标题: reqFTP.Headers.Add("ContentType: text/plain; charset=\"ISO-8859-1\"");没有抛出任何异常。但这并没有解决问题。
    最近更新 更多