C#使用FtpWebRequest 基礎鏈接已經關閉:鏈接被意外關閉(The underlying connection was closed:The connection was close...

 公司內部開發的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

相關文章
相關標籤/搜索