2014-10-09 109 views
6

我想用下面的代码获得FTPS的FileZilla服务器的目录列表:底层连接已关闭。服务器犯了违反协议

ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory); 
ftpRequest.EnableSsl = true; 

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateCertificate); 
ftpRequest.Credentials = new NetworkCredential(user, pass); 
ftpRequest.UseBinary = true; 
ftpRequest.UsePassive = true; 
ftpRequest.KeepAlive = true; 
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; 
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse(); 

我得到了一个异常时,FtpWebResponse)ftpRequest.GetResponse()执行:

底层连接被关闭。服务器承诺违反协议 。

当我切换到正常的FTP连接。一切工作正常。

我错过了什么来建立这个FTPS连接? 感谢您的帮助

+0

你有权访问Filezilla服务器吗?你确定证书是有效的吗?你配置它正确使用**明确的FTPS ** – 2014-10-09 12:52:05

+0

是的我有权访问服务器。证书也是有效的,并且显式的FTPS被检查。我正在使用引用隐式SSL/TLS连接的端口990。它是否支持FtpWebRequest? – MadNeox 2014-10-09 13:04:27

回答

6

隐FTPSFtpWebRequest类(见here)的支持。

EnableSsl设置为true,它实际上触发AUTH TLS命令到服务器,要求启动一个明确 FTPS会议。

就你而言,你必须配置Filezilla Server以使用Explicit FTPS。该过程记录在Filezilla Wiki

+0

这是真的。我会考虑尝试使用第三方库来使用显式/隐式FTPS会话。感谢帮助。 – MadNeox 2014-10-09 13:28:48

+1

您可以使用[FtpClient](http://netftp.codeplex.com/)库。 – 2014-10-09 13:29:46

+0

我会...再次感谢您的支持和帮助。祝你今天愉快 ! – MadNeox 2014-10-09 13:31:13

4

我遇到了同样的问题,但上传文件,在ftpWriter.Close()。 另外,例如,在成功的PrinWorkingDirectory之后,我无法执行GetRequestStream。

这个问题似乎是后期的“期待:100-继续” - 虽然我没有完全检查这个问题,但问题在某处。

我试着在互联网上找到的每个解决方案:改变的KeepAlive为true,则增加了App.config文件

<system.net> 
    <settings> 
     <servicePointManager expect100Continue="false"/> 
     <httpWebRequest useUnsafeHeaderParsing="true"/> 
    </settings> 
</system.net> 

真的没什么工作。

我花了很多时间和尝试不同的其他第三方库(想法我不喜欢太多),直到最后我来到一个代码,使用相同的类和方法,但工作! 分析代码后,我终于明白:代码针对的是.NET Framework 2.0,而代码则是针对.NET Framework 4.5。 我似乎微软在从Framework 3.5传递到Framework 4时做了一些小错误。

由于它不是将新项目转换为旧框架的解决方案,因此您可以为FTP操作创建一个dll,指向3.5 .NET Framework,或者,您可以使用第三方库。

我也许有点晚了,但它可能会在未来帮助其他受挫的开发者。

+0

我会试一试 – 2016-07-24 17:10:35

+0

如果这是客户端中的错误,我想知道为什么它只在连接到filezilla服务器时才会发生?我的代码可以和其他服务器一起工 – 2017-09-06 19:04:27

相关问题