公司内部开发的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连接不到服务器,只是换了一种方式也算是一种解决办法,没必要在一个点上出不来。

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

C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed unexpectedly)的更多相关文章

  1. WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

    在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...

  2. c# 基础连接已经关闭: 连接被意外关闭,错误的解决

    原文:c# 基础连接已经关闭: 连接被意外关闭,错误的解决 调试一个使用HttpWebRequest模拟提交表单的程序的时候频繁出现上述错误提示,google了一下发现了几个解决方案.1.在appli ...

  3. Post数据到 https异常:基础连接已经关闭: 连接被意外关闭 解决办法

    POST数据到HTTPS站点的时候需要设置ServicePointManager类的ServerCertificateValidationCallback属性,并且在POST到https://pass ...

  4. httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭

    win10下,C# 用httpWebRequest 执行post请求出现"请求错误,基础连接已经关闭: 连接被意外关闭",经测试设置 //Post请求方式 System.Net.H ...

  5. WCF连接被意外关闭

    WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭 在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于W ...

  6. HslCommunication库的二次协议扩展,适配第三方通讯协议开发,基础框架支持长短连接模式

    本文将使用一个gitHub开源的项目来扩展实现二次协议的开发,该项目已经搭建好了基础层架构,并实现了三菱,西门子,欧姆龙,MODBUS-TCP的通讯示例,也可以参照这些示例开发其他的通讯协议,并Pul ...

  7. 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?

    看到了一道面试题:"为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?",想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章 ...

  8. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...

  9. c#对数据库访问完应关闭连接

    1.对数据库的连接SqlConnection con = new SqlConnection(constr);使用完成后,应该至少应该close或dispose关闭.否则会导致数据库例如(SQl200 ...

随机推荐

  1. ltp日志

    grep "fail" -i /var/log/messages |wc -lgrep "fail" -i /var/log/messagesgrep &quo ...

  2. Linux shell脚本全面学习(一)

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在 ...

  3. go输出九九乘法表和金字塔

    用go语言实现输出九九乘法表和金字塔: 1.输出九九乘法表: 代码示例: package main import ( "fmt" "time" ) //实现99 ...

  4. pika详解(五)登录认证及connectionParameters

    pika详解(五)登录认证及connectionParameters 本文链接:https://blog.csdn.net/comprel/article/details/94662916 版权 pi ...

  5. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

  6. python做反被爬保护的方法

    python做反被爬保护的方法 网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护.于是,很 ...

  7. CMOS图像传感器理解

    CMOS图像传感器理解 水流方向从左边流向右边,上面有一个开关,拧下去的时候水流停止,拧上去的时候水流打开.左边是水流的源头我们给它起个名字,叫做源端(就是源头的意思嘛),右边是水流出去的地方,也就是 ...

  8. halcon——缺陷检测常用方法总结(频域空间域结合)

    摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...

  9. 二、特殊DNS解析

    一.DNS轮询 1.为站点 www.tedu.cn 提供DNS轮询解析,三台Web服务器节点的IP地址分别为: 192.168.4.10.192.168.4.20.192.168,4.30 步骤: 虚 ...

  10. RabbitMQ由浅入深入门全总结(二)

    写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇 PS:那 ...