2013-10-07 110 views
0

我在密码中使用带有特殊字符“§”的FtpWebRequest时出现问题。 的代码看起来是这样的:C#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的转换密码“啪\ 302 \ 247”,尝试登录并失败。之后,FileZilla重新尝试连接成功的密码“pa \ 247”。
  • FtpWebRequest将密码转换为“pa \ 302 \ 247”,尝试登录并失败,并引发异常。

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

谢谢。

回答

0

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

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(); 
+0

谢谢。您提供的代码会引发此异常: “InvalidOperationException:此集合包含响应标头并且不能包含指定的请求标头。” 我试图添加标头: reqFTP.Headers.Add(“ContentType:text/plain; charset = \”ISO-8859-1 \“”); 哪些没有抛出任何异常。 但它没有解决问题。 – k3flo