Verwenden von FTP mit einem CERN-basierten Proxy mit WinInet-APIs
Wichtig
Die Internet Explorer 11-Desktopanwendung wird für bestimmte Versionen von Windows 10 eingestellt und ab dem 15. Juni 2022 nicht mehr unterstützt.
Sie können mit dem Internet Explorer-Modus in Microsoft Edge weiterhin auf ältere Websites zugreifen, für die Internet Explorer erforderlich ist. Anleitung.
Die Internet Explorer 11-Desktopanwendung wird schrittweise an den schnelleren, sichereren Microsoft Edge-Browser umgeleitet und letztendlich über Windows Update deaktiviert werden. Deaktivieren von IE heute.
Ein CERN-basierter Webproxyserver verwendet HTTP für die gesamte Kommunikation mit seinen Clients. Daher kann der FTP-Satz von Wininet-Funktionen nicht zum Herunterladen von Ressourcen auf einem FTP-Server verwendet werden, wenn im Auftrag des Clients über einen CERN-basierten Proxy auf den FTP-Server zugegriffen wird. Stattdessen muss der Client allgemeine Wininet-Funktionen verwenden, z. B. InternetOpenUrl und um die Daten aus dem InternetReadFile HTTP-Stream, der vom CERN-basierten Proxyserver gesendet wurde, ordnungsgemäß abzurufen.
Ursprüngliche Produktversion: Internet Explorer
Ursprüngliche KB-Nummer: 166961
Weitere Informationen
CERN-kompatible Proxydienste unterstützen HTTP-, FTP- und Gopher-Anforderungen. Die Kommunikation zwischen dem CERN-basierten Proxyserver und seinen Clients verwendet jedoch nur HTTP. Das folgende Diagramm zeigt, wie eine FTP-Anforderung mit einem CERN-kompatiblen Proxydienst weitergeleitet wird:
Get ftp://host.com/root/test.doc HTTP 1.0 FTP Request
|=========| |=============| |=============|
| |---------------->| Cern-based |--------->| |
| Client | HTTP | Proxy Server| FTP | Ftp Server |
| |<----------------| |<---------| |
|=========| |=============| |=============|
HTTP/1.0 200 <document> FTP Response
Da ein CERN-basierter Proxyserver mit seinen Clients in HTTP kommuniziert, können Sie den FTP-Satz von Wininet-Funktionen nicht verwenden, wenn der Client über den Proxyserver auf den FTP-Server zugreift. Stattdessen sollten Sie InternetOpenUrl InternetReadFile die angeforderten Daten aus dem vom Proxyserver gesendeten HTTP-Stream verwenden und abrufen.
Wenn die übergebene FTP-URL InternetOpenUrl eine URL zu einer Datei auf dem FTP-Server ist, können Sie den gesamten InternetReadFile Dateiinhalt lesen. Wenn die übergebene FTP-URL InternetOpenUrl eine URL zu einem Verzeichnis auf dem FTP-Server ist, wird eine InternetReadFile Verzeichnisauflistung der FTP-URL als HTML-Dokument abgerufen. In beiden Fällen müssen Sie aufrufe möglicherweise schleifen, InternetReadFile bis alle Daten im HTTP-Stream gelesen werden.
Wenn der Client etwas weiter unterhalb der FTP-Verzeichnis-URL abrufen möchte, muss er das HTML-Dokument analysieren, um URLs zu Unterverzeichnissen oder Dateien abzurufen und mehr InternetOpenUrl und InternetReadFile Aufrufe auszugeben. Wenn auch ein CERN-basierter Proxy verwendet wird, sollte das INTERNET_FLAG_RAW_DATA Flag nicht im Aufruf angegeben InternetOpenUrl werden.
Der folgende Pseudocode veranschaulicht, wie Sie aufrufen InternetOpenUrl und InternetReadFile wann ein CERN-basierter Proxyserver für den Zugriff auf einen FTP-Server verwendet wird:
CHAR strURL[] = "ftp://host.com/root/test.doc";
HANDLE f; //local file handle
HINTERNET hInternetFile;
DWORD dwRead, dwWritten;
CHAR szTemp[1024];
hInternetFile = InternetOpenUrl(hInternetSession, (LPCTSTR)strURL, NULL,
0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hInternetFile == NULL)
{
do
some error processing;
quit;
}
//download the file to c:\deleteme
f = CreateFile("c:\\deleteme", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (f == INVALID_HANDLE_VALUE)
{
do
some error processing;
quit;
}
while (InternetReadFile(hInternetFile, (LPVOID)szTemp, 1024, &dwRead))
{
if (!dwRead)
break;
WriteFile(f, (LPVOID)szTemp, dwRead, &dwWritten, NULL);
}
CloseHandle(f);
//if the strURL is a URL to a file on the ftp server, we get the file
//and store it in c:\deleteme.
//if the strURL is a URL to a directory on the ftp server, c:\deleteme
//will be a HTML page of the directory listing. You will have to parse
//the html page, and construct new URLs, and call the above code again.
Wenn der Client eine direkte Verbindung mit einem FTP-Server hat oder über einen TIS-FTP-Proxyserver mit dem FTP-Server verbunden ist, erfolgt die Kommunikation zum und vom Client per FTP. Der Client kann das INTERNET_FLAG_RAW_DATA InternetOpenUrl Kennzeichen angeben und dann InternetFindNextFile verwenden, um eine WIN32_FIND_DATA Struktur abzurufen und alle Unterverzeichnisse und Dateien der URL auflisten. Der Client kann in solchen Situationen auch den FTP-Satz von Wininet-Funktionen verwenden.
Der folgende Pseudocode veranschaulicht, wie InternetOpenUrl und InternetReadFile wann das INTERNET_FLAG_RAW_DATA Kennzeichen im Aufruf angegeben InternetOpenUrl wird:
CHAR strURL[] = "ftp://host.com/root/test.doc";
HANDLE f; //local file handle
HINTERNET hInternetFile;
DWORD dwRead, dwWritten;
CHAR szTemp[1024];
hInternetFile = InternetOpenUrl(hInternetSession, (LPCTSTR)strURL, NULL,
0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hInternetFile == NULL)
{
do
some error processing;
quit;
}
//download the file to c:\deleteme
f = CreateFile("c:\\deleteme", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (f == INVALID_HANDLE_VALUE)
{
do
some error processing;
quit;
}
while (InternetReadFile(hInternetFile, (LPVOID)szTemp, 1024, &dwRead))
{
if (!dwRead)
break;
WriteFile(f, (LPVOID)szTemp, dwRead, &dwWritten, NULL);
}
CloseHandle(f);
//if the strURL is a URL to a file on the ftp server, we get the file
//and store it in c:\deleteme.
//if the strURL is a URL to a directory on the ftp server, c:\deleteme
//will be a HTML page of the directory listing. You will have to parse
//the html page, and construct new URLs, and call the above code again.
Wenn die Verbindung zwischen dem Client und dem FTP-Server direkt oder über einen TIS-FTP-Proxy erfolgt InternetOpenUrl und InternetReadFile tatsächlich FTP-Datenverkehr anstelle von HTTP-Datenverkehr generiert.
Die obige Erläuterung zur Verwendung von Wininet-APIs mit CERN-basiertem Proxy gilt auch für GOPHER. Außerdem ist es wichtig zu beachten, dass Wininet-APIs nur HTTP-, HTTPS-, FTP- und GOPHER-URLs unterstützen. Für DATEI-URLs wie file://server/share/file oder file:// \ \server\share\file müssen Sie Win32-APIs wie FileCopy verwenden, um die Datei auf den Clientcomputer herunterzuladen, oder FindFirstFile, FindNextFile und FindClose zum Aufzählen eines Verzeichnisses.