【问题标题】:The underlying connection was closed. The server committed a protocol violation基础连接已关闭。服务器违反了协议
【发布时间】:2014-10-09 12:45:02
【问题描述】:

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

【问题讨论】:

  • 您可以访问 Filezilla 服务器吗?你确定证书有效吗?您是否正确配置它以使用 explicit FTPS
  • 是的,我可以访问服务器。证书也是有效的,并且检查了显式 FTPS。我使用的是指隐式 SSL/TLS 连接的端口 990。 FtpWebRequest 支持吗?

标签: c# ssl ftpwebrequest filezilla ftps


【解决方案1】:

隐式 FTPSFtpWebRequest 类支持(请参阅 here)。

EnableSsl 设置为true 时,它​​实际上会向服务器触发AUTH TLS 命令,要求启动一个显式 FTPS 会话。

在您的情况下,您必须将 Filezilla 服务器配置为使用显式 FTPS。该过程记录在Filezilla Wiki

【讨论】:

  • 确实如此。我会考虑尝试使用 3rd 方库来同时使用显式/隐式 FTPS 会话。感谢您的帮助。
  • 我会...再次感谢您的支持和帮助。祝你有美好的一天!
【解决方案2】:

我也遇到了同样的问题,但在 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,或者,您可以使用第三方库。

我可能有点晚了,但它可能会在未来帮助其他沮丧的开发人员。

【讨论】:

  • 如果这是客户端的错误,我想知道为什么它似乎只在连接到 filezilla 服务器时才会发生?我的代码适用于其他服务器
【解决方案3】:

现在是从 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;
                }
            }

希望它能帮助像我一样受苦的其他人,曾经。 谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2011-01-29
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多