2014-01-19 6 views
6

Я создал FTP-код для передачи файлов. Этот код работает отлично, за исключением того, что иногда приводит к ошибке 500. Точной ошибки есть -Fixing - System.Net.WebException: Удаленный сервер возвратил ошибку: (500) Ошибка синтаксиса, команда unrecognized

Error: System.Reflection.TargetInvocationException: Exception has 
been thrown by the target of an invocation. 
---> System.Net.WebException: The remote server returned an error: 
(500) Syntax error, command unrecognized. 
    at System.Net.FtpWebRequest.CheckError() 
    at System.Net.FtpWebRequest.SyncRequestCallback(Object obj) 
    at System.Net.CommandStream.Abort(Exception e) 
    at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage) 
    at System.Net.FtpWebRequest.GetRequestStream() 
    at ST_772dn22cj49ndfddatee.csproj.ScriptMain.Main() 
    --- End of inner exception stack trace --- 

Я заметил, что ошибка возникает, когда самый большой файл загружен, то есть около 290 КБ. Все остальные файлы меньше этого, и я не получаю от них исключения. Я не знаю, почему это происходит. Может кто-нибудь сказать мне, почему ?

Как в стороне, в случае, если вы заметите какую-то возможность улучшить мой код или логическую ошибку, пожалуйста, укажите это также. Я действительно не ищу обзоры кода, но его приветствую.

public void Main() 
{ 

    Boolean conditions = true; 

    if(conditions == true) 
    { 
    string fileLocation = "my windows directory"; 
    string fileName = "fileName.extension"; 

    string ftpFolder = @"/ftpFolder/"; 
    Boolean ftpMode = true; //passive or active. True = passive 
    string ftpPassword = "password"; 
    int ftpPort = 21;// the default 
    string ftpServerName = "server name"; 
    string ftpUserName = "user name"; 

    //Create an object to communicate with the server. 
    string ftpRequestString = "ftp://" + ftpServerName + ":" 
    + ftpPort + ftpFolder + fileName; 

    try{ 

    FtpWebRequest request = 
    (FtpWebRequest)WebRequest.Create(ftpRequestString); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 

    request.Credentials = new NetworkCredential(ftpUserName, ftpPassword); 

    //Set mode 
    if(ftpMode == true){ 
     request.UsePassive = true; 
    } 

    //Copy the file to the request. 

    string filePath = @fileLocation + "\\" + fileName; 
    StreamReader sourceStream = new StreamReader(filePath); 
    byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
    sourceStream.Close(); 
    request.ContentLength = fileContents.Length; 

    Stream requestStream = request.GetRequestStream(); 
    requestStream.Write(fileContents, 0, fileContents.Length); 
    requestStream.Close(); 

    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

    response.Close(); 

    } 
    catch (WebException ex) 
    { 
     MessageBox.Show(ex.Message); 

    }//try-catch 

    } 

}//main 
+0

У меня такая же проблема, и я не могу найти ответ. Вы нашли решение для этого @HappyCoder? Если да, то, пожалуйста, поделитесь им. Я начинаю щедрость на этом. Благодарю. – Steam

ответ

5

Читая ваш вопрос, я был подозрительным, это связано с (или может быть исправлено) Установка KeepAlive в false. Глядя на SO - этот вопрос ссылается на ту же проблему и указывает на него, а также: https://stackoverflow.com/a/2071374/1803682

установка Try:

request.KeepAlive = false; 

С KeepAlive набор для false подключение будет closed at the end of each request. Если вы передаете большое количество файлов, это может быть проблемой, так как требуется время для повторной передачи учетных данных и т. Д. Положительным моментом является воссоздание соединения в известном/начальном состоянии, которое должно решить вашу проблему (даже если это не корень причина).

Чтобы узнать, что происходит, если вы можете включить подробное ведение журнала на своем сервере, вы должны увидеть последнюю команду, выпущенную перед тем, как увидеть эту ошибку. Это должно дать вам лучшее представление о том, что происходит. Найдено this thread говорить почти то же самое.

Update:

Если бы я прочитал в нижней ссылке, которую я разместил сам я мог бы ответить даже лучше, команда, вероятно, быть переиздан некоторая часть процесса входа в систему (т.е. USER username), и это ваш вопрос скорее всего:

The reason the creadentials may no longer be valid is that the WebRequest uses a lease that expires after a certain amount of time. If you don't explicitly instantiate the lease and define its timeouts, the FtpWebRequest appears to use default timeout values. I believe what's happening is that when the lease expires the FtpWebRequest will then try to log on again.

Так смотрит here с правом поиска:

урожайности, что тайм-аут по умолчанию ожидания запросов не я nfinite как specified но фактически 10000 ms. Что кажется довольно большим расхождением. Поэтому вы также можете попробовать установить:

request.Timeout = -1; 

И проверьте, исправлена ​​ли ошибка.


На самом деле не думаю, что это может быть ваш вопрос так, сдвинув его на дно:

Также - убедитесь, что ваш request.ReadWriteTimeout подходит для скорости вы видите для большего файла. По умолчанию 5 minutes, что довольно долго для 290k, поэтому я ожидаю, что это не источник вашей ошибки. Кроме того, я бы ожидал, что закрытая ошибка соединения, если это проблема.

+0

Можете ли вы рассказать мне, как request.KeepAlive = false; может быть связано с ошибкой? Раньше я никогда не делал FTP-код, поэтому не знаю. Благодарю. – Steam

+1

@blasto Не знаете, почему вы получаете сообщение об ошибке - включите ведение журнала на вашем ftp, и вы сможете увидеть команду, вызывающую проблему. * Я думаю *, что установка 'KeepAlive' на' false' приведет к по существу перезагрузке соединения для отправки следующего/нового файла, а не повторного использования существующего. Будет немного медленнее, но, скорее всего, не приведет к ошибкам. – Matthew

+0

@blasto Обновлено с еще более подробной информацией. – Matthew

3

Я тоже столкнулся с тем же исключением с FTPWebRequest в пользовательской MSBuild задачи ... к счастью, задача подвергается настройке UsePassive="false" (который устанавливает UsePassive свойства на FTPWebRequest объекте). Исправлена ​​проблема с изменением значения на "true". Надеюсь это поможет!

  • (Установить) UsePassive к false, если процесс передачи данных клиентского приложения прослушивает соединения на порт данных; в противном случае, true, если клиент должен инициировать соединение на порте данных. Значение по умолчанию: true.
  • Установка значения UsePassive на true отправляет команду "PASV" на сервер. Эта команда требует, чтобы сервер прослушивал порт данных и ожидал подключения, а не инициировал его при получении команды передачи.
  • Если значение UsePassive равно true, FTP-сервер может не отправлять размер файла, и процесс загрузки всегда может быть равен нулю. Если UsePassive установлен в false, брандмауэр может поднять предупреждение и заблокировать загрузку файла.
0

Для любого другого, у кого есть эта проблема, и выше, похоже, не работает, я обнаружил, что, когда я ударил вышеуказанную ошибку, это связано с моим именем пользователя или паролем. Я уверен, что есть немало людей, которые копируют и вставляют из Excel в SQL, поэтому из-за этого SQL подобрал, что мое имя пользователя/пароль снабжено линией возврата каретки (когда вы нажимаете enter).

Мой код фактически взял имя пользователя как «Myusername & vbcrlf».

Надеюсь, это поможет кому-то, если у них такая же проблема.

Cheers!

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

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