C#使用FtpWebRequest报错: The operation has timed out. at System.Net.FtpWebRequest.GetRequestStream()

1、参考:https://www.cnblogs.com/junjie94wan/archive/2013/12/25/3490253.html

                https://www.cnblogs.com/huangzijian/p/6200802.html

               https://www.cnblogs.com/dadonggg/p/8778318.html

2、通过netstat -ano |findstr "10.12.2.201",发现服务端有很多TIME_WAIT,这里客户端再有上传文件请求,可能会得不响应,

      查看代码发现,此时处于被动模式下,通过网上的文章可以看出

FtpWebRequest
//
// 摘要:
//     获取或设置客户端应用程序的数据传输过程的行为。
//
// 返回结果:
// 如果客户端应用程序的数据传输过程侦听数据端口上的连接(服务端连客户端数据侦听端口,主动),则为 false;
// 如果客户端应在数据端口上启动连接(客户端连服务端数据侦听端口,被动),则为 true。默认值为 true。
//
// 异常:
//   T:System.InvalidOperationException:
//     对于一个已在进行的请求为此属性指定了一个新值。
public bool UsePassive { get; set; }

1、主动模式(false), 数据传输:服务端数据端口20主动连接客户端数据侦听端口,
服务端端口占用少,主要使用指令端口21+数据端口20
会有服务端穿客户端防火墙问题
2、被动模式(true),数据传输:客户端连接服务端(非20数据端口),
服务端占用端口可能会比较多,指令端口21+多个数据端口
同样有客户端穿服务端防火墙问题
不过只需要在服务端设置防火墙策略,而不用像主动模式需要在多个客户端电脑上配防火墙策略。
因为TCP的TIME_WAIT问题,如果上传文件,上传一次就打开一个连接
可能会造成TIME_WAIT过多,从而客户端不能再上传文件
即调用GetRequestStream()时,会报错,重启客户端程序,又可以上传了
但是经过一段时间可能又会有以上问题。

3、解决方法

解决方法:
1、使用主动连接
2、在程序上传期间只开一个FTP连接进行文件的上传,如果连接中断再开,
避免上传一个文件就开一个FTP连接。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值