公司內部開發的winform程序使用了FtpWebRequest下載FTP服務器的文件到本地。html
大多數人運行良好,因爲咱們是試運行逐步有人加入到平臺的使用,前兩天忽然有個別機器沒法鏈接FTP服務器報出了以下錯誤。程序員
The underlying connection was closed:The connection was closed unexpectedlywindows
進行排查沒有發現異常,windows事件管理器中查看也沒有相關的錯誤。寫的代碼也沒有發現什麼不對的地方服務器
FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url)); reqFtp.UseBinary = true; reqFtp.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD); FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse(); Stream ftpStream = response.GetResponseStream(); int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); FileStream outputStream = new FileStream(newFileName, FileMode.Create); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close();
一時之間比較懵逼,同時網上搜索FtpWebRequest "基礎鏈接被關閉,鏈接被意外關閉" 的異常更是少之又少。估計這年頭你們都不怎麼開發桌面程序,因此用到這個類的出現問題的更少。網絡
可是說實話寫了winform程序的人或許對多線程,事件委託,網絡請求,Windows服務等技術會有更深的理解。多線程
無奈沒有現成的解決方案,加上99%的人運行程序正常,最後懷疑是機器環境問題。因爲工做比較忙就直接喊運維給他從新裝了系統(這個方法不推薦,咱們狀況比較特殊)。運維
經過重裝後就能正常下載文件了,可是又過了2天,這位同窗的機器又沒法下載了(這部分同窗對電腦不是很熟悉,解壓軟件有時候都不知道裝)。不知道是操做了什麼仍是殺毒軟件誤殺。測試
最後本着不能讓別人再裝系統吧,得找一下是否是本身程序得問題。url
測試+搜索依然毫無進展,而後我就去官方文檔看了下,直到我發現這個東西:.net
而後進入GitHub
stack overflow上面的關於這個第三方庫的問答。
最後從新改寫下載代碼,使用 nuget 添加FluentFTP類庫
using (FtpClient conn = new FtpClient()) { conn.Host = uri.Host; conn.Port = uri.Port; conn.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD); byte[] outBuffs; bool flag = conn.Download(out outBuffs, uri.AbsolutePath); FileStream fs = new FileStream(newFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Write(outBuffs, 0, outBuffs.Length); //清空緩衝區、關閉流 fs.Flush(); fs.Close(); }
最後更新程序後一切都風平浪靜了!
其實這個問題不該該是FtpWebRequest的問題,由於這個類是依賴.net Framework的,應該是部分機器環境問題致使可能出現未知的網絡問題。換用FluentFTP只是換了一個第三方庫,在打包程序的時候被一塊兒打包了。因此之後再操做這種網絡請求的時候仍是儘可能用第三方庫吧,畢竟每一個機器環境咱們沒法排查(程序員會修電腦?)。
最後說下HttpWebRequest也存在一樣的各類意想不到的問題,建議你們用 RestSharp 這個庫。其實通篇下來並無找到具體是什麼致使FtpWebRequest鏈接不到服務器,只是換了一種方式也算是一種解決辦法,不必在一個點上出不來。
出於網上對這個問題並無怎麼說起,特地記錄下來。若是有道友知道確切出現問題的點還請留下你的經驗。
原文出處:https://www.cnblogs.com/SunSpring/p/12100427.html