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

相关文章
相关标签/搜索