WinHttpWriteData-Funktion (winhttp.h)
Die WinHttpWriteData-Funktion schreibt Anforderungsdaten auf einen HTTP-Server.
Syntax
WINHTTPAPI BOOL WinHttpWriteData(
[in] HINTERNET hRequest,
[in] LPCVOID lpBuffer,
[in] DWORD dwNumberOfBytesToWrite,
[out] LPDWORD lpdwNumberOfBytesWritten
);
Parameter
[in] hRequest
Gültiges HINTERNET-Handle, das von WinHttpOpenRequest zurückgegeben wird. Warten Sie, bis WinHttpSendRequest abgeschlossen ist, bevor Sie diese Funktion aufrufen.
[in] lpBuffer
Zeiger auf einen Puffer, der die Daten enthält, die an den Server gesendet werden sollen. Stellen Sie sicher, dass dieser Puffer bis nach Abschluss von WinHttpWriteData gültig bleibt.
[in] dwNumberOfBytesToWrite
Ganzzahlwert ohne Vorzeichen, der die Anzahl der Bytes enthält, die in die Datei geschrieben werden sollen.
[out] lpdwNumberOfBytesWritten
Zeiger auf eine ganzzahlige Variable ohne Vorzeichen, die die Anzahl der in den Puffer geschriebenen Bytes empfängt. Die WinHttpWriteData-Funktion legt diesen Wert vor der Arbeit oder Fehlerüberprüfung auf Null fest. Wenn Sie WinHTTP asynchron verwenden, muss dieser Parameter auf NULL festgelegt werden und die Informationen in der Rückruffunktion abrufen. Dies kann zu einem Speicherfehler führen.
Rückgabewert
Gibt TRUE zurück, wenn der Vorgang erfolgreich war, oder andernfalls FALSE . Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten. Zu den zurückgegebenen Fehlercodes gehören:
Fehlercode | BESCHREIBUNG |
---|---|
|
Die Verbindung mit dem Server wurde zurückgesetzt oder beendet, oder es wurde ein inkompatibles SSL-Protokoll gefunden. Beispielsweise unterstützt WinHTTP, Version 5.1, SSL2 nur dann, wenn der Client dies ausdrücklich aktiviert. |
|
Der angeforderte Vorgang kann nicht ausgeführt werden, da sich der angegebene Handle nicht im richtigen Zustand befindet. |
|
Der Typ des angegebenen Handles ist für diesen Vorgang falsch. |
|
Ein interner Fehler ist aufgetreten. |
|
Der Vorgang wurde abgebrochen, in der Regel, weil der Handle, an dem die Anforderung ausgeführt wurde, vor Abschluss des Vorgangs geschlossen wurde. |
|
Timeout für die Anforderung. |
|
Für den angeforderten Vorgang war nicht genügend Arbeitsspeicher verfügbar. (Windows-Fehlercode) |
Hinweise
Selbst wenn WinHTTP im asynchronen Modus verwendet wird (d. h. wenn WINHTTP_FLAG_ASYNC in WinHttpOpen festgelegt wurde), kann diese Funktion synchron oder asynchron ausgeführt werden. Wenn diese Funktion FALSE zurückgibt, können Sie GetLastError aufrufen, um erweiterte Fehlerinformationen abzurufen. Wenn diese Funktion TRUE zurückgibt, verwenden Sie die WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE Vervollständigung, um zu bestimmen, ob diese Funktion erfolgreich war, und den Wert der Parameter. Die WINHTTP_CALLBACK_STATUS_REQUEST_ERROR Vervollständigung gibt an, dass der Vorgang asynchron abgeschlossen wurde, aber ein Fehler aufgetreten ist.
Wenn eine status Rückruffunktion mit WinHttpSetStatusCallback installiert wurde, zeigen die folgenden Benachrichtigungen, die im dwNotificationFlags-Parameter von WinHttpSetStatusCallback festgelegt wurden, den Fortschritt beim Senden von Daten an den Server an:
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_WRITTEN
- WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
- WINHTTP_CALLBACK_STATUS_REQUEST_SENT
- WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
Zweitens erfordern NTLM und Negotiate möglicherweise mehrere Handshakes, um die Authentifizierung abzuschließen, was erfordert, dass die Daten für jede Authentifizierungsbeine erneut POST'ediert werden. Dies kann bei großen Datenuploads sehr ineffizient sein.
Um diese beiden Probleme zu umgehen, besteht eine Lösung darin, eine idempotente Aufwärmanforderung wie HEAD zuerst an die authentifizierende V-Dir zu senden, die mit dieser Anforderung verbundenen Authentifizierungsheraufforderungen und erst dann POST-Daten zu behandeln. Solange derselbe Socket für die Verarbeitung des POST-Vorgangs erneut verwendet wird, sollten keine weiteren Authentifizierungsproblemen auftreten und alle Daten gleichzeitig hochgeladen werden. Da ein authentifizierter Socket nur für nachfolgende Anforderungen innerhalb derselben Sitzung wiederverwendet werden kann, sollte der POST im selben Socket ausgeführt werden, solange der Socket nicht mit gleichzeitigen Anforderungen im Pool zusammengefasst ist, die um ihn konkurrieren.
Beispiele
Dieses Beispiel zeigt Code, der Daten auf einen HTTP-Server schreibt. Der im Beispiel angegebene Servername www.wingtiptoys.com ist fiktiv und muss durch den Namen eines Servers ersetzt werden, für den Sie Schreibzugriff haben.
PCSTR pszData = "WinHttpWriteData Example";
DWORD dwBytesWritten = 0;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"A WinHTTP Example Program/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"www.wingtiptoys.com",
INTERNET_DEFAULT_HTTP_PORT, 0);
// Create an HTTP Request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"PUT",
L"/writetst.txt",
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
0);
// Send a Request.
if (hRequest)
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0,
(DWORD)strlen(pszData), 0);
// Write data to the server.
if (bResults)
bResults = WinHttpWriteData( hRequest, pszData,
(DWORD)strlen(pszData),
&dwBytesWritten);
// End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);
// Report any errors.
if (!bResults)
printf("Error %d has occurred.\n",GetLastError());
// Close any open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP, Windows 2000 Professional mit SP3 [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003, Windows 2000 Server mit SP3 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | winhttp.h |
Bibliothek | Winhttp.lib |
DLL | Winhttp.dll |
Verteilbare Komponente | WinHTTP 5.0 und Internet Explorer 5.01 oder höher unter Windows XP und Windows 2000. |