FtpWebRequest к микроконтроллеру всегда приводит к (451) локальной ошибке при обработке

Я пишу приложение Windows Forms на С#, которое позволяет пользователю подключаться к микроконтроллеру и загружать программные файлы через FTP.

Я могу успешно загружать программные файлы через Filezilla. Но когда я запускаю приведенный ниже код, я получаю сообщение об ошибке. Удаленный сервер вернул ошибку: (451) Локальная ошибка при обработке. в строке ftpstream.Close(); каждый раз, независимо от того, какой файл я пытаюсь загрузить, независимо от размера или типа файла, и новый файл действительно отображается в Filezilla на FiPy, но с размером 0 байт.

Я стер все программные файлы на микроконтроллере, поэтому я знаю, что проблема не в месте для хранения, и я не думаю, что это проблема с брандмауэром, поскольку я могу успешно загрузить через Filezilla.

Создаваемое WebException не показывает дополнительных сведений в InnerException, а StatusDescription возвращается в виде пустой строки.

Я разместил этот вопрос на форуме для конкретного микроконтроллера, который я использую, но не получил решения. Вот ссылка на этот пост, он включает журналы FTP и некоторые решения, которые были опробованы в комментариях: https://forum.pycom.io/topic/6937/fipy-ftp-upload-in-c-возвращает-451-локальная-ошибка-в-обработке

Я исчерпал все результаты Google.

Может кто-нибудь мне помочь?

Мой код:

            var deviceFilepath = "ftp://192.168.4.1/flash/main.py";
            var appFilepath = "rwis\\main.py";

            string UserId = "micro";
            string Password = "python";

            FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(deviceFilepath);
            ftp.Credentials = new NetworkCredential(UserId, Password);

            ftp.UsePassive = true;
            ftp.Method = WebRequestMethods.Ftp.UploadFile;

            var buffer = File.ReadAllBytes(appFilepath);

            Stream ftpstream = ftp.GetRequestStream();
            ftpstream.Write(buffer, 0, buffer.Length);
            ftpstream.Close();

ИЗМЕНИТЬ:

Журнал FTP от Filezilla:

2021-04-09 09:36:52 3608 1 Status: Connecting to 192.168.4.1:21...
2021-04-09 09:36:52 3608 1 Status: Connection established, waiting for welcome message...
2021-04-09 09:36:52 3608 1 Response: 220 Micropython FTP Server
2021-04-09 09:36:52 3608 1 Status: Plain FTP is insecure. Please switch to FTP over TLS.
2021-04-09 09:36:52 3608 1 Command: USER micro
2021-04-09 09:36:52 3608 1 Response: 331 
2021-04-09 09:36:52 3608 1 Command: PASS ******
2021-04-09 09:36:52 3608 1 Response: 230 
2021-04-09 09:36:52 3608 1 Status: Server does not support non-ASCII characters.
2021-04-09 09:36:52 3608 1 Status: Logged in
2021-04-09 09:36:52 3608 1 Status: Retrieving directory listing...
2021-04-09 09:36:52 3608 1 Command: PWD
2021-04-09 09:36:52 3608 1 Response: 257 /
2021-04-09 09:36:52 3608 1 Status: Directory listing of "/" successful
2021-04-09 09:36:55 3608 1 Status: Retrieving directory listing of "/flash"...
2021-04-09 09:36:55 3608 1 Command: CWD /flash
2021-04-09 09:36:55 3608 1 Response: 250 
2021-04-09 09:36:55 3608 1 Command: TYPE I
2021-04-09 09:36:55 3608 1 Response: 200 
2021-04-09 09:36:55 3608 1 Command: PASV
2021-04-09 09:36:55 3608 1 Response: 227 (192,168,4,1,7,232)
2021-04-09 09:36:55 3608 1 Command: LIST
2021-04-09 09:36:55 3608 1 Response: 150 
2021-04-09 09:36:56 3608 1 Response: 226 
2021-04-09 09:36:56 3608 1 Status: Directory listing of "/flash" successful
2021-04-09 09:36:59 3608 1 Status: Starting upload of C:\Users\fcons_tzfi6gp\Documents\GitHub\production-assembly-app\bin\Debug\rwis\rwis_config.py
2021-04-09 09:36:59 3608 1 Command: TYPE A
2021-04-09 09:36:59 3608 1 Response: 200 
2021-04-09 09:36:59 3608 1 Command: PASV
2021-04-09 09:36:59 3608 1 Response: 227 (192,168,4,1,7,232)
2021-04-09 09:36:59 3608 1 Command: STOR rwis_config.py
2021-04-09 09:36:59 3608 1 Response: 150 
2021-04-09 09:36:59 3608 1 Response: 226 
2021-04-09 09:36:59 3608 1 Status: File transfer successful, transferred 1,361 bytes in 1 second

Журнал FTP из моего кода:

System.Net Information: 0 : [15404] FtpWebRequest#47891719::.ctor(ftp://192.168.4.1/flash/rwis_config.py)
System.Net Information: 0 : [15404] FtpWebRequest#47891719::GetRequestStream(Method=STOR.)
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Created connection from 192.168.4.2:61116 to 192.168.4.1:21.
System.Net Information: 0 : [15404] Associating FtpWebRequest#47891719 with FtpControlStream#16454088
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [220 Micropython FTP Server]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [USER micro]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [331 ]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [PASS ********]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [230 ]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [OPTS utf8 on]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [502 ]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [PWD]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [257 /]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [TYPE I]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [200 ]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [PASV]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [227 (192,168,4,1,7,232)]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Sending command [STOR flash/rwis_config.py]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [150 ]
System.Net Information: 0 : [15404] FtpControlStream#16454088 - Received response [451 ]

person tw3399    schedule 08.04.2021    source источник
comment
Попробуйте использовать WebClient, он, по-видимому, может загружать на FTP, хотя я никогда не использовал (и, вероятно, использует FtpWebRequest). В частности, Msft отказался от FtpWebRequest и рекомендует использовать сторонние библиотеки.   -  person pinkfloydx33    schedule 09.04.2021
comment
Верно. См. Примечания : мы не рекомендуем использовать класс FtpWebRequest для новой разработки. Для получения дополнительной информации и альтернатив FtpWebRequest см. WebRequest не должно быть используется на GitHub.   -  person    schedule 09.04.2021
comment
Хотя MS устарела FtpWebRequest, она все еще отлично работает. И WebClient использует FtpWebRequest под капотом. Так что переход на него вряд ли поможет. + Покажите нам файл журнала из FileZilla и ваш код .NET. (оба работают на одном локальном компьютере)   -  person Martin Prikryl    schedule 09.04.2021
comment
Спасибо за ответы! Я попробовал WebClient и получил тот же результат. Это просто пришло из метода client.Upload(), и я подумал, что это менее описательно и менее полезно, чем показать с помощью FtpWebRequest, что это происходит именно из метода .Close(). Отредактировал мой вопрос, чтобы добавить журналы из Filezilla и мой код.   -  person tw3399    schedule 09.04.2021
comment
Это только что пришло из client.Upload()..... это строка, которая выдает ошибку. Хотел быть более ясным.   -  person tw3399    schedule 09.04.2021
comment
Единственным реальным вариантом для вас является взломать Wireshark и проследить, что делает FileZilla по сравнению с тем, что делает код C#. Я предполагаю, что FTP-сервер на вашем микроконтроллере делает что-то необычное, что FileZilla обрабатывает правильно, а .NET - нет.   -  person Ian Kemp    schedule 09.04.2021
comment
FileZilla загружает файл в режиме ascii. Вы пробовали это в своем коде? – Другая возможность заключается в том, что сервер не может обработать путь в STOR flash/rwis_config.py, в то время как FileZilla обрабатывает CWD /flash + STOR rwis_config.py. Вы ничего не можете с этим поделать. + Действительно ли ваш FTP-сервер возвращает код без сообщения ([451 ])? Или ты редактировал лог?   -  person Martin Prikryl    schedule 09.04.2021
comment
Является ли режим ascii, когда вы устанавливаете для ftp.UseBinary значение false? Я пробовал это и получил ту же ошибку. Или это не то, как вы устанавливаете режим ascii? Да, я задавался вопросом, был ли путь проблемой, но не мог найти способ отправить команду CWD с помощью ftpWebRequest. Нет, я не редактировал журнал, он действительно не дает мне сообщения об ошибке или чего-либо полезного для решения этой проблемы. Фу.   -  person tw3399    schedule 09.04.2021
comment
Да UseBinary=false. Как я пишу, вы не можете заставить .NET отправить команду CWD. Возможно, вам придется попробовать другую клиентскую библиотеку FTP. Попробуйте FluentFTP.   -  person Martin Prikryl    schedule 10.04.2021


Ответы (1)


Я заставил его работать с FluentFTP. Я не уверен на 100%, в чем была проблема, возможно, с помощью CWD она была исправлена, возможно, какая-то базовая логика/команда в FluentFTP справились с этим лучше, в любом случае, журнал FTP теперь более точно соответствует журналу Filezilla, и ошибок больше нет!

Мой новый код:

        FtpClient client = new FtpClient("ftp://192.168.4.1");
        client.Credentials = new NetworkCredential(UserId, Password);
        client.DataConnectionType = FtpDataConnectionType.PASV;
        client.Connect();
        client.SetWorkingDirectory("/flash");

        client.UploadFile(appFilepath, "rwis_config.py", FtpRemoteExists.NoCheck);

        client.Disconnect();

Новый журнал FTP:

# Connect()
Status:   Connecting to ***:21
Response: 220 Micropython FTP Server
Command:  USER ***
Response: 331 
Command:  PASS ***
Response: 230 
Command:  FEAT
Response: 211 no-features
Status:   Text encoding: System.Text.ASCIIEncoding
Command:  SYST
Response: 215 UNIX Type: L8

# SetWorkingDirectory("/flash")
Command:  CWD /flash
Response: 250 

# UploadFile("rwis\rwis_config.py", "rwis_config.py", NoCheck, False, None)

# OpenWrite("rwis_config.py", Binary)
Command:  TYPE I
Response: 200 

# OpenPassiveDataStream(PASV, "STOR rwis_config.py", 0)
Command:  PASV
Response: 227 (192,168,4,1,7,232)
Status:   Connecting to ***:2024
Command:  STOR rwis_config.py
Response: 150 
Status:   Disposing FtpSocketStream...
Response: 226 
Status:   Testing connectivity using Socket.Poll()...
Command:  QUIT
Response: 221 
Status:   Disposing FtpSocketStream...
person tw3399    schedule 13.04.2021