最近做項目,要用到FTP上傳文件和下載文件。
然后就用FtpWebRequest類寫個上傳和下載的程序。
主要是對EMS物流這一塊,每天定時上傳禮品配送的信息,然后定時下載生成好的物流信息。
就是在上傳的時候,遇到一個很怪異的問題。本地測試沒有任務問題,但是放到服務器上問題就來了。
主要是在服務器上,上傳以后就報異常,而且EMS FTP服務器也有這個文件,就是沒有數據。
一直報異常550,連接超時,然后在網上找原因啊,多數是說地址是否正確,有沒有權限之類的。
本身FtpWebRequest超時默認是5分鍾的,但是沒有到5分鍾就報異常了。對着網上找到的資料一點一點的設置,根本就不行。
好吧,以上都解決不了,那就從服務器找起吧,查看事件啊,沒有一點有用的信息。想想可能是防火牆的問題,准備讓網管到機房把物理防火牆先停掉。
但是吧,機房不是每天能進的,決定先從代碼找起。看看每個屬性的設置,對着MSDN一點一點的找。
最后在FtpWebRequest 的UsePassive屬性找到的原因,雖然VS里面有很好的智能提示功能, 但是提示的信息很簡短。
看MSDN的備注有句話是這樣描述的:如果 UsePassive 被設置為 true,FTP 服務器可能不會發送文件的大小,而且下載進度可能始終為零。如果 UsePassive 被設置為 false,則防火牆可能會引發警報並阻止文件下載。
我在寫代碼的時候,設置了False,所以,防火牆根本就不讓我去讀取文件的內容。設置成True,文件很快就上傳成功了。
注意:如果設置成True,FTP服務器不會發送文件的大小,下載進度也可能始終為零。這個最好的解決辦法,還是在防火牆上進行設置吧。