Condividi tramite


Funzione WinHttpWriteData (winhttp.h)

La funzione WinHttpWriteData scrive i dati delle richieste in un server HTTP.

Sintassi

WINHTTPAPI BOOL WinHttpWriteData(
  [in]  HINTERNET hRequest,
  [in]  LPCVOID   lpBuffer,
  [in]  DWORD     dwNumberOfBytesToWrite,
  [out] LPDWORD   lpdwNumberOfBytesWritten
);

Parametri

[in] hRequest

Handle HINTERNET valido restituito da WinHttpOpenRequest. Attendere il completamento di WinHttpSendRequest prima di chiamare questa funzione.

[in] lpBuffer

Puntatore a un buffer che contiene i dati da inviare al server. Assicurarsi che questo buffer rimanga valido fino al completamento di WinHttpWriteData .

[in] dwNumberOfBytesToWrite

Valore intero lungo senza segno che contiene il numero di byte da scrivere nel file.

[out] lpdwNumberOfBytesWritten

Puntatore a una variabile integer long senza segno che riceve il numero di byte scritti nel buffer. La funzione WinHttpWriteData imposta questo valore su zero prima di eseguire qualsiasi controllo di lavoro o errore. Quando si usa WinHTTP in modo asincrono, questo parametro deve essere impostato su NULL e recuperare le informazioni nella funzione di callback. Non in questo modo può causare un errore di memoria.

Valore restituito

Restituisce TRUE se ha esito positivo o FALSE in caso contrario. Per informazioni sull'errore estese, chiamare GetLastError. Tra i codici di errore restituiti sono:

Codice di errore Descrizione
ERROR_WINHTTP_CONNECTION_ERROR
La connessione al server è stata reimpostata o terminata o è stato rilevato un protocollo SSL non compatibile. Ad esempio, WinHTTP versione 5.1 non supporta SSL2 a meno che il client non lo abilita in modo specifico.
ERROR_WINHTTP_INCORRECT_HANDLE_STATE
Impossibile eseguire l'operazione richiesta perché l'handle fornito non è nello stato corretto.
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
Il tipo di handle fornito non è corretto per questa operazione.
ERROR_WINHTTP_INTERNAL_ERROR
Si è verificato un errore interno.
ERROR_WINHTTP_OPERATION_CANCELLED
L'operazione è stata annullata, in genere perché l'handle in cui è stata eseguita la richiesta è stata chiusa prima del completamento dell'operazione.
ERROR_WINHTTP_TIMEOUT
Timeout della richiesta.
ERROR_NOT_ENOUGH_MEMORY
Memoria insufficiente per completare l'operazione richiesta. (Codice errore di Windows)

Commenti

Anche quando WinHTTP viene usato in modalità asincrona, ovvero quando WINHTTP_FLAG_ASYNC è stato impostato in WinHttpOpen, questa funzione può operare in modo sincrono o asincrono. Se questa funzione restituisce FALSE, è possibile chiamare GetLastError per ottenere informazioni di errore estese. Se questa funzione restituisce TRUE, usare il completamento WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE per determinare se questa funzione è riuscita e il valore dei parametri. Il completamento WINHTTP_CALLBACK_STATUS_REQUEST_ERROR indica che l'operazione è stata completata in modo asincrono, ma non riuscita.

Avviso Quando si usa WinHTTP in modo asincrono, impostare sempre il parametro lpdwNumberOfBytes Write su NULL e recuperare i byte scritti nella funzione callback; in caso contrario, può verificarsi un errore di memoria.
 
Quando l'applicazione invia dati, può chiamare WinHttpReceiveResponse per terminare il trasferimento dei dati. Se Viene chiamato WinHttpCloseHandle , il trasferimento dei dati viene interrotto.

Se è stata installata una funzione di callback dello stato con WinHttpSetStatusCallback, quelle delle notifiche seguenti impostate nel parametro dwNotificationFlags di WinHttpSetStatusCallback indicano lo stato di avanzamento nell'invio di dati al server:

  • 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
Due problemi possono verificarsi quando si tenta di inviare dati POST (o PUT) ai proxy o ai server che verificano problemi tramite NTLM o Negozia autenticazione. Prima di tutto, questi proxy o server possono inviare 401/407 sfide e chiudere la connessione prima che tutti i dati possano essere POST'ed, in questo caso, non solo WinHttpWriteData non riesce, ma anche WinHTTP non può gestire le sfide di autenticazione. NTLM e Negotiate richiedono che tutte le handshake di autenticazione vengano scambiate sulla stessa connessione socket, quindi l'autenticazione non riesce se la connessione viene interrotta prematuramente.

In secondo luogo, NTLM e Negotiate possono richiedere più handshake per completare l'autenticazione, che richiede che i dati vengano riabilitati per ogni fase di autenticazione. Questo può essere molto inefficiente per i caricamenti di dati di grandi dimensioni.

Per risolvere questi due problemi, una soluzione consiste nell'inviare una richiesta di riscaldamento idempotente, ad esempio HEAD all'autenticazione v-dir, gestire prima le sfide di autenticazione associate a questa richiesta e solo i dati POST. Purché lo stesso socket venga riutilizzato per gestire il POST'ing, non è necessario riscontrare ulteriori problemi di autenticazione e tutti i dati possono essere caricati contemporaneamente. Poiché un socket autenticato può essere riutilizzato solo per le richieste successive all'interno della stessa sessione, il post deve uscire nello stesso socket purché il socket non sia in pool con richieste simultanee concorrenti.

Nota Per Windows XP e Windows 2000, vedere la sezione Requisiti di runtime della pagina iniziale WinHTTP.
 

Esempio

In questo esempio viene illustrato il codice che scrive i dati in un server HTTP. Il nome del server specificato nell'esempio , www.wingtiptoys.com, è fittizio e deve essere sostituito con il nome di un server per cui si dispone dell'accesso in scrittura.

    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);

Requisiti

   
Client minimo supportato Windows XP, Windows 2000 Professional con SP3 [solo app desktop]
Server minimo supportato Windows Server 2003, Windows 2000 Server con SP3 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione winhttp.h
Libreria Winhttp.lib
DLL Winhttp.dll
Componente ridistribuibile WinHTTP 5.0 e Internet Explorer 5.01 o versione successiva in Windows XP e Windows 2000.

Vedi anche

Informazioni su Microsoft Windows HTTP Services (WinHTTP)

Versioni WinHTTP

WinHttpConnect

WinHttpOpen

WinHttpOpenRequest