C# FtpWebRequest - 密码中的特殊字符“§”

本文关键字:特殊字符 FtpWebRequest 密码 | 更新日期: 2023-09-27 18:34:08

我在使用带有特殊字符"§"的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# FtpWebRequest - 密码中的特殊字符“§”

这似乎是一个编码问题。§ 字符在 UTF-8 中为 ''302''247,在 ISO-8859-1 中为 ''247。根据您提供的信息,这告诉我您的请求是使用字符集 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();