Udostępnij za pośrednictwem


Funkcja WinINet FtpPutFile zwraca powodzenie, gdy zostanie zwrócony stan 451

Ten artykuł pomaga rozwiązać problem polegający na tym, że funkcja Windows Internet (WinINet) FtpPutFile nadal zwraca wartość TRUE nawet wtedy, gdy operacja kończy się niepowodzeniem ze stanem 451.

Oryginalna wersja produktu: Internet Explorer 10, 9
Oryginalny numer KB: 2790777

Symptomy

Interfejs API Wininet.dll FtpPutFile zwraca wartość TRUE , nawet jeśli operacja kończy się niepowodzeniem z następującym stanem:

451 — Żądana akcja została przerwana: błąd lokalny w przetwarzaniu.

Sekwencja zdarzeń prowadzących do tego wyniku jest podobna do następującej:

FTP:Odpowiedź na port 28376, "230 Logowanie powiodło się".
FTP:Response to Port 28376, "200 Przełączanie do trybu ASCII".
FTP:Żądanie z portu 28376, "PASV"
FTP:Response to Port 28376, '227 Entering Passive Mode (192,168,0,99,213,154)."
FTP:Żądanie z portu 28376,'STOR myTesting.txt'
FTP:Response to Port 28376, '150 Ok to send data'.
(Teraz dane są wysyłane do 192 168 0 99 z portem 256x213+154 = 54682)
FTP:Response to Port 28376, "451 Failure write to local file".

Przyczyna

Funkcja WinINet FtpPutFile (w tym zarówno FtpPutFileA i FtpPutFileW) zgłasza kod stanu jako TRUE , mimo że wewnętrzna implementacja FtpPutFile funkcji WinINet już przechwyciła błąd 451 zapisywania w lokalnym pliku odpowiedzi błędu z serwera.

Rozwiązanie

Aby obejść ten problem, sprawdź kod FtpPutFile stanu powrotu zamiast polegać na interfejsie API zwracającym wartość False. Aby to osiągnąć, możesz użyć InternetGetLastResponseInfo() funkcji , aby sprawdzić serwer-odpowiedź.

Uwaga 16.

Protokół FTP może zwracać dodatkowe informacje tekstowe wraz z większością błędów. Te rozszerzone informacje o błędzie można pobrać przy użyciu InternetGetLastResponseInfo funkcji .