Поделиться через


WinINet FtpPutFile возвращает успешное выполнение, когда возвращается состояние 451

Эта статья поможет устранить проблему, из-за которой функция Windows Internet (WinINet) FtpPutFile по-прежнему возвращает значение TRUE , даже если операция завершается сбоем с состоянием 451.

Исходная версия продукта: Internet Explorer 10, 9
Исходный номер базы знаний: 2790777

Симптомы

API Wininet.dll FtpPutFile возвращает значение TRUE, даже если операция завершается сбоем со следующим состоянием:

451 — запрошенное действие прервано: локальная ошибка при обработке.

Последовательность событий, ведущих к этому результату, аналогична следующей:

FTP:Response to Port 28376, "230 Login успешно".
FTP:Response to Port 28376, "200 Переключение на режим ASCII".
FTP:Request from Port 28376, PaSV
FTP:Response to Port 28376, '227 Ввод пассивного режима (192,168 0 99 213 154)."
FTP:Request from Port 28376,'STOR myTesting.txt'
FTP:Response to Port 28376, "150 OK для отправки данных".
(Теперь данные отправляются в 192 168 0 99 с портом 256x213+154 = 54682)
FTP:Response to Port 28376, "451 Сбой записи в локальный файл".

Причина

Функция WinINet (включая оба FtpPutFileA и) сообщает код состояния как TRUE, несмотря на то, что внутренняя реализация FtpPutFile функции WinINet FtpPutFile уже захватила сообщение об ошибке 451 записи в локальный ответ на ошибку файла с FtpPutFileWсервера.

Обходное решение

Чтобы обойти эту проблему, проверьте код FtpPutFile состояния возврата вместо того, чтобы полагаться на API, возвращающий false. Для этого можно использовать функцию InternetGetLastResponseInfo() для проверки сервера-ответа.

Примечание.

Протокол FTP может возвращать дополнительные текстовые сведения вместе с большинством ошибок. Эти расширенные сведения об ошибке InternetGetLastResponseInfo можно получить с помощью функции.