底层连接已关闭。服务器提交了协议违规

时间:2014-10-09 12:45:02

标签: c# ssl ftpwebrequest filezilla ftps

我正在尝试使用以下代码获取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连接的内容? 谢谢你的帮助

3 个答案:

答案 0 :(得分:6)

{p> 隐含的FTPS <{1}}类支持 <(请参阅here)。

FtpWebRequest设置为true时,它实际上会向服务器发出EnableSsl命令,要求启动 Explicit FTPS会话。

在您的情况下,您必须将Filezilla Server配置为使用Explicit FTPS。该程序记录在Filezilla Wiki

答案 1 :(得分:4)

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

这个问题在帖子中似乎是“Expect:100-continue” - 虽然我没有完全检查过这个问题,但问题出在那里。

我已尝试在互联网上找到的所有解决方案:将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,或者,您可以使用第三方库。

我可能有点晚了,但未来可能会帮助其他受挫的开发者解决这个问题。

答案 2 :(得分:0)

这是从ftp迁移到sftp的时间!
您可以遵循以下代码参考:

using Renci.SshNet;
using System.IO;
     private void UploadFileToSFTP()
            {
                try
                {
                    String sourcefile = @"C:\path\file.txt"; 
                    String host = @"000.000.000.0"; 
                    String username = @"usename"; 
                    String password = @"password"; 
                    int port = 22;
                    string destinationpath = "/var/www/html/path/public/destinationfolder";
                    using (SftpClient client = new SftpClient(host, port, username, password))
                    {
                        client.Connect();
                        client.ChangeDirectory(destinationpath);
                        using (FileStream fs = new FileStream(sourcefile, FileMode.Open))
                        {
                            client.BufferSize = 4 * 1024;
                            client.UploadFile(fs, Path.GetFileName(sourcefile));
                        }
                    }
        }
                catch (Exception)
                {
                    throw;
                }
            }
希望它将帮助像我一样遭受痛苦的另一个人。 谢谢!