• C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed unexpectedly)


     公司内部开发的winform程序使用了FtpWebRequest下载FTP服务器的文件到本地。

    大多数人运行良好,由于我们是试运行逐步有人加入到平台的使用,前两天突然有个别机器无法连接FTP服务器报出了如下错误。

    The underlying connection was closed:The connection was closed unexpectedly

     进行排查没有发现异常,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天,这位同学的机器又无法下载了(这部分同学对电脑不是很熟悉,解压软件有时候都不知道装)。不知道是操作了什么还是杀毒软件误杀。

    最后本着不能让别人再装系统吧,得找一下是不是自己程序得问题。

    测试+搜索依然毫无进展,然后我就去官方文档看了下,直到我发现这个东西:

     然后进入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连接不到服务器,只是换了一种方式也算是一种解决办法,没必要在一个点上出不来。

    出于网上对这个问题并没有怎么提及,特意记录下来。如果有道友知道确切出现问题的点还请留下你的经验。

  • 相关阅读:
    动态字节码技术Javassist
    自己实现简单版的注解Mybatis
    AOP实现事务和记录日志
    自己实现简单版SpringMVC
    静态变量
    docker安装nginx , 安装mysql5.6,安装redis3.2
    Worker Thread模式
    linux 安装jdk
    dockfile构建自己的tomcat
    docker使用2
  • 原文地址:https://www.cnblogs.com/SunSpring/p/12100427.html
Copyright © 2020-2023  润新知