Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Configura le informazioni di registrazione per la risposta corrente.
Sintassi
virtual HRESULT SetLogData(
IN VOID* pLogData
) = 0;
Parametri
pLogData
[IN] Puntatore a VOID.
Valore restituito
Oggetto HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.
| Valore | Descrizione |
|---|---|
| S_OK | Indica che l'operazione è riuscita. |
Commenti
È possibile utilizzare il SetLogData metodo per modificare i valori che IIS scriverà in un file di log. Per usare questo metodo in un modulo HTTP, il modulo deve prima chiamare il metodo ISendResponseProvider::GetReadyToLogData per verificare che IIS sia pronto per registrare le informazioni e quindi chiamare il metodo ISendResponseProvider::GetLogData per recuperare un VOID puntatore che verrà eseguito il cast a una struttura HTTP_LOG_FIELDS_DATA .
Nota
La HTTP_LOG_FIELDS_DATA struttura è definita nel file di intestazione Http.h.
È possibile utilizzare la HTTP_LOG_FIELDS_DATA struttura per modificare uno dei valori registrati da IIS, ad esempio il nome del server o la stringa dell'agente utente del client. Al termine della modifica dei valori di log, usare SetLogData per inviare i valori modificati a IIS.
Esempio
Nell'esempio di codice seguente viene illustrato come creare un modulo HTTP che usa il GetReadyToLogData metodo per determinare se IIS è pronto per le informazioni di log. Il modulo completa i passaggi seguenti:
Usa il
GetLogDatametodo per recuperare unaHTTP_LOG_FIELDS_DATAstruttura.Usa questa struttura per recuperare il nome del server dalle informazioni del log.
Modifica la porta del server nella voce di log.
Utilizza il
SetLogDatametodo per inviare le informazioni del log modificate a IIS.Restituisce il nome del server a un client Web e quindi viene chiuso.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnSendResponse(
IN IHttpContext * pHttpContext,
IN ISendResponseProvider * pProvider
)
{
// Retrieve log status.
if (TRUE == pProvider->GetReadyToLogData())
{
// Retrieve log information.
PHTTP_LOG_FIELDS_DATA pLogData =
(PHTTP_LOG_FIELDS_DATA) pProvider->GetLogData();
// Test for an error.
if (NULL != pLogData)
{
// Clear the existing response.
pHttpContext->GetResponse()->Clear();
// Set the MIME type to plain text.
pHttpContext->GetResponse()->SetHeader(
HttpHeaderContentType,"text/plain",
(USHORT)strlen("text/plain"),TRUE);
// Return the server name.
WriteResponseMessage(pHttpContext,
"Server name: ",pLogData->ServerName);
// Modify the port number.
pLogData->ServerPort = 8080;
// Set the log data.
HRESULT hr = pProvider->SetLogData(pLogData);
// Test for an error.
if (FAILED(hr))
{
// Set the error status.
pProvider->SetErrorStatus( hr );
// End additional processing.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
}
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
private:
// Create a utility method that inserts a name/value pair into the response.
HRESULT WriteResponseMessage(
IHttpContext * pHttpContext,
PCSTR pszName,
PCSTR pszValue
)
{
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Create a data chunk.
HTTP_DATA_CHUNK dataChunk;
// Set the chunk to a chunk in memory.
dataChunk.DataChunkType = HttpDataChunkFromMemory;
// Buffer for bytes written of data chunk.
DWORD cbSent;
// Set the chunk to the first buffer.
dataChunk.FromMemory.pBuffer =
(PVOID) pszName;
// Set the chunk size to the first buffer size.
dataChunk.FromMemory.BufferLength =
(USHORT) strlen(pszName);
// Insert the data chunk into the response.
hr = pHttpContext->GetResponse()->WriteEntityChunks(
&dataChunk,1,FALSE,TRUE,&cbSent);
// Test for an error.
if (FAILED(hr))
{
// Return the error status.
return hr;
}
// Set the chunk to the second buffer.
dataChunk.FromMemory.pBuffer =
(PVOID) pszValue;
// Set the chunk size to the second buffer size.
dataChunk.FromMemory.BufferLength =
(USHORT) strlen(pszValue);
// Insert the data chunk into the response.
hr = pHttpContext->GetResponse()->WriteEntityChunks(
&dataChunk,1,FALSE,TRUE,&cbSent);
// Test for an error.
if (FAILED(hr))
{
// Return the error status.
return hr;
}
// Return a success status.
return S_OK;
}
};
// Create the module's class factory.
class MyHttpModuleFactory : public IHttpModuleFactory
{
public:
HRESULT
GetHttpModule(
OUT CHttpModule ** ppModule,
IN IModuleAllocator * pAllocator
)
{
UNREFERENCED_PARAMETER( pAllocator );
// Create a new instance.
MyHttpModule * pModule = new MyHttpModule;
// Test for an error.
if (!pModule)
{
// Return an error if the factory cannot create the instance.
return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
else
{
// Return a pointer to the module.
*ppModule = pModule;
pModule = NULL;
// Return a success status.
return S_OK;
}
}
void Terminate()
{
// Remove the class from memory.
delete this;
}
};
// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo * pModuleInfo,
IHttpServer * pGlobalInfo
)
{
UNREFERENCED_PARAMETER( dwServerVersion );
UNREFERENCED_PARAMETER( pGlobalInfo );
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Set the request priority.
hr = pModuleInfo->SetPriorityForRequestNotification(
RQ_SEND_RESPONSE,PRIORITY_ALIAS_HIGH);
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
// Set the request notifications and exit.
return pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_SEND_RESPONSE,
0
);
}
Il modulo deve esportare la funzione RegisterModule . È possibile esportare questa funzione creando un file di definizione del modulo (con estensione def) per il progetto oppure è possibile compilare il modulo usando l'opzione /EXPORT:RegisterModule . Per altre informazioni, vedere Procedura dettagliata: Creazione di un modulo HTTP Request-Level tramite codice nativo.
Facoltativamente, è possibile compilare il codice usando la __stdcall (/Gz) convenzione di chiamata anziché dichiarare in modo esplicito la convenzione di chiamata per ogni funzione.
Requisiti
| Tipo | Descrizione |
|---|---|
| Client | - IIS 7.0 in Windows Vista - IIS 7.5 in Windows 7 - IIS 8.0 in Windows 8 - IIS 10.0 in Windows 10 |
| Server | - IIS 7.0 in Windows Server 2008 - IIS 7.5 in Windows Server 2008 R2 - IIS 8.0 in Windows Server 2012 - IIS 8.5 in Windows Server 2012 R2 - IIS 10.0 in Windows Server 2016 |
| Prodotto | - IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0 - IIS Express 7.5, IIS Express 8.0, IIS Express 10.0 |
| Intestazione | Httpserv.h |
Vedere anche
Interfaccia ISendResponseProvider
Metodo ISendResponseProvider::GetLogData