2013-10-07 111 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