使用C#連線 FTP 技巧整理

使用C#程式進行 FTP 連線時,會因為各種不同的 FTP 相關設定,導致各種不同種類的問題如:連線失敗、路徑找不到、編碼錯誤等等。但抓取系統相關 FTP 的Exception有時候並沒有那麼詳細,甚至會有Log與實際問題無關聯性的問題產生,故撰寫此篇文章記錄下可能產生的問題以及如何撰寫程式可以避免問題及快速測試。

 

相關設定

主動與被動模式:主動與被動模式的第一步驟都是要由客戶端發起請求,差別在於主動是客戶端發起請求後,服務器端主動向客戶端發起連線請求,而被動模式則是直接對客戶端驗證過後開始傳輸資料,以我的理解來比喻的話,主動模式比較類似Oauth的雙向驗證機制,而被動模式則是客戶端打API向服務器端要資料,所以以被動模式的情況連線相較於主動模式比較不容易被防火牆擋下,因為連線時的port以及連線都有通才能連接的上,主動模式則是還多一步向客戶端發起請求的過程,服務器端對外的防火牆以及客戶端的防火牆都有可能對這一步的連線造成影響。

 

FTP的字符編碼(codepage)主要跟傳輸文字文件,例如txt、csv之類相關的檔案有關,因為不同文件的分隔跟換行符號,以及對同一個字符有不同的編碼方式,所以會造成傳輸過去的文本亂碼或是錯誤,至於圖片或其他檔案如Excel等二進制文件則理論上不影響。

 

補充:字符編碼錯誤有可能會導致我們連線FTP服務器端的時候路徑錯誤或是找不到路徑,例如資料夾含有中文時使用codepage 950進行連線時資料夾名稱會是亂碼,所以會找不到相對路徑。

 

傳輸模式:分為FTPS跟SFTP還有FTP三種,實務上不會使用FTP,因為其數據、帳號和密碼都是明文傳輸了容易被截取或被中間人攻擊,SFTP跟FTPS則都是有經過加密的傳輸模式,差異在於實作加密的底層方式不同,FTPS是基於FTP傳輸模式上使用SSL或TLS來協定來加密,SFTP則是基於SSH而不是基於FTP運行的協議,但其傳輸的數據也是經過加密的,實務上則是一句使用環境去做選擇。

 

初始連線:FTP服務器端設定時會選擇一個預設路徑給用戶端作為連線路徑,需要注意的是程式端或用戶端一般是沒有辦法用”./”或是”../”等方式獲取資料夾上層的檔案或資訊的,所以對於程式端來說擁有權限的只有初始連線資料夾及其子資料夾跟檔案的權限,設定上要多加留意。

 

程式細節

在使用C#撰寫程式時,我們常會使用Path.Combine來組合檔案路徑,但因為我們一般程式運行在windows系統,路徑中的斜線一般”\”反斜線為主,但是ftp上一般的路徑則是以”/ “正斜線為主所以保險起見最好是組合完成後把所有的反斜線取代為正斜線,確保程式能正卻找到ftp上的目標路徑。

 

另外,如上所述主動與被動模式codepage傳輸模式初始連線資訊等等的設定都建議寫成設定檔,因為很多客戶端其實對於自己環境的ftp也不太了解,所以寫成設定才方便及時調整跟測試,更保險的做法將連線的路徑以及相關設定都寫成log才容易在出錯時查詢到問題。

 

總結

即使是寫程式有多年經驗的人,也不一定會有接觸到撰寫ftp相關程式的機會,即使有機會接觸,也不一定會因為設定問題導致程式錯誤,但也正是因為遇到的機率不高,所以導致實際遇到時更難以找到問題的源頭,要能解決問題若是只能從程式面著手,只能提高自身對於FTP運作模式跟原理的理解,在遇到問題時推斷相關原因時的準度也能更準確。


發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料