2015-05-27 5 views
-1

Я только что создал FTP-сервер на основе приведенного здесь кода http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c7409/A-C-FTP-Server.htm. Затем я установил пакеты Nuget для FtpClient, чтобы создать тестовый FTP-клиент, который подключается к FTP-серверу. Ниже мой код:Неизвестная команда FEAT при доступе к 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); 
     } 
} 

Проблема может быть, что у меня нет обработчика команд для ПОДВИГА в моем сервере. Но мой FTP-сервер отлично работает с filezilla. Если требуется обработчик команд, может ли кто-нибудь предоставить мне код для этого?

Если я игнорирую эту ошибку, я получаю это исключение в методе тестирования «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом».

Любые идеи?

[EDIT] Вот полное исключение:

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() 
+0

Что такое пакеты Nuget для FtpClient? Вот этот? https://www.nuget.org/packages/System.Net.FtpClient/ Можете ли вы включить точное сообщение об исключении и его столбец вызова? Можете ли вы включить трассировку (см. «FtpTrace») и включить файл трассировки в свой вопрос? –

+0

Итак, вы просто видите сообщение «Неизвестная команда FEAT» где-то в журнале, не так ли? Вы действительно не получаете ошибку. Сообщение совершенно не имеет отношения к вашей проблеме. –

+0

Сообщение «Неизвестная команда FEAT» все еще существует, потому что у меня нет обработчика команд для этого на моем FTP-сервере. Мой вопрос был (если вы внимательно его прочитаете ... весь вопрос ... это на английском языке), то исключение ли из-за недоступности обработчика команд для FEAT или по какой-то другой причине. Если это из-за обработчика команд, предоставьте мне код. В противном случае, как я могу решить проблему, если я игнорирую сообщение «Неизвестная команда FEAT». Итак, если вы понимаете все это (и я надеюсь, что вы это делаете !!), мой ответ устраняет проблему, игнорируя это сообщение. Иисус... – sanmis

ответ

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)); 
     }   
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^