【问题标题】:Unknown command FEAT when accessing FTP server访问 FTP 服务器时的未知命令 FEAT
【发布时间】:2015-08-09 02:35:54
【问题描述】:

我刚刚根据http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c7409/A-C-FTP-Server.htm 此处提供的代码创建了一个 FTP 服务器。然后我为 FtpClient 安装了 Nuget 包,这样我就可以创建一个连接到 FTP 服务器的测试 FTP 客户端。以下是我的代码:

[TestMethod]
    async public Task TestMethod1() // wanted to make it async as I may connect have something related to database in future
    {
        var client = new FtpClient
        {
            Host = "127.0.0.1",
            Port = 21,
            Credentials = new NetworkCredential
            {
                UserName = "123",
                Password = "123",
            },
            DataConnectionType = FtpDataConnectionType.PASV // If I don't add this, I get EPSV unknown command
        };

        await client.ConnectAsync();
        Debug.WriteLine("Connected");

        client.SetWorkingDirectory(@"C:\Users\myname\Desktop");
        Debug.WriteLine(client.GetWorkingDirectory());

        try
        {
            var items = client.GetListing(); // Exception shows up here.
            Debug.WriteLine(items.Count());
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
}

问题可能是我的服务器中没有 FEAT 的命令处理程序。但是,我的 FTP 服务器在使用 filezilla 时运行良好。如果需要命令处理程序,有人可以提供我的代码吗?

如果我忽略此错误,我会在测试方法“无法从传输连接中读取数据:现有连接被远程主机强行关闭”中收到此异常。

有什么想法吗?

[编辑] 这是完整的例外:

Test method Blackhawk.Core.FtpServer.Test.UnitTest1.TestMethod1 threw exception: 
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. --->        System.Net.Sockets.SocketException: An existing connection was forcibly closed   by the remote host
    at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
   at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
 --- End of inner exception stack trace ---
     at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
   at    System.Net.FtpClient.FtpSocketStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.FtpClient.FtpSocketStream.ReadLine(Encoding encoding)
   at System.Net.FtpClient.FtpClient.GetReply()
   at System.Net.FtpClient.FtpClient.Execute(String command)
   at System.Net.FtpClient.FtpClient.OpenPassiveDataStream(FtpDataConnectionType type, String command, Int64 restart)
   at System.Net.FtpClient.FtpClient.OpenDataStream(String command, Int64 restart)
   at System.Net.FtpClient.FtpClient.GetListing(String path, FtpListOption options)
   at System.Net.FtpClient.FtpClient.GetListing(String path)
   at Blackhawk.Core.FtpServer.Test.UnitTest1.<TestMethod1>d__2.MoveNext() in UnitTest1.cs: line 44
 --- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()

【问题讨论】:

  • 什么“FtpClient 的 Nuget 包”?这个? nuget.org/packages/System.Net.FtpClient 你能包含一个确切的异常消息及其调用堆栈吗?您可以启用跟踪(请参阅FtpTrace)并将跟踪文件包含在您的问题中吗?
  • 所以您只是在日志的某处看到“Unknown command FEAT”消息,对吗?你并没有真正得到错误。该消息与您的问题完全无关。
  • 消息“Unknown command FEAT”仍然存在,因为我的 FTP 服务器中没有命令处理程序。我的问题是(如果您仔细阅读......整个问题......它是英文的),是否异常是因为 FEAT 的命令处理程序不可用或其他原因。如果是因为命令处理程序,请提供我的代码。否则,如果我忽略“未知命令 FEAT”消息,我该如何解决问题。所以,如果你理解了整个事情(我希望你明白!!),我的回答通过忽略这条消息来解决问题。耶稣...

标签: c# ftp ftp-client ftpwebrequest ftp-server


【解决方案1】:

我能够通过将数据连接类型更改为 AutoActive 来解决问题。这是有效的最终代码:

[TestMethod]
    async public Task FtpTestUser1()
    {
        var client = new FtpClient
        {
            Host = "127.0.0.1",
            Port = 21,
            Encoding = System.Text.Encoding.Default,
            Credentials = new NetworkCredential
            {
                // Storing username, password and default directory in a .dat file
                UserName = "123", 
                Password = "123",
            },
            DataConnectionType = FtpDataConnectionType.AutoActive // Changed this part.
        };

        await client.ConnectAsync();
        Debug.WriteLine("Connected");

        var path = @"Test"; // This path is now relative to the default directory

        client.SetWorkingDirectory(path);
        Debug.WriteLine(client.GetWorkingDirectory());


        var items = client.GetListing();
        Assert.IsTrue(items.Any());
        Debug.WriteLine(items.Count());

        foreach (var ftpListItem in items)
        {
            Debug.WriteLine(string.Format("File name is {0}", ftpListItem.Name));
        }        
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多