0

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

谢谢你。

4

1 回答 1

0

这似乎是一个编码问题。§字符是UTF-8中的\302\247ISO-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();
于 2013-10-07T13:14:28.150 回答