IHttpContext::GetCurrentExecutionStats, méthode
Récupère les statistiques d’exécution pour le contexte actuel.
Syntaxe
virtual HRESULT GetCurrentExecutionStats(
DWORD* pdwNotification,
DWORD* pdwNotificationStartTickCount = NULL,
PCWSTR* ppszModule = NULL,
DWORD* pdwModuleStartTickCount = NULL,
DWORD* pdwAsyncNotification = NULL,
DWORD* pdwAsyncNotificationStartTickCount = NULL
) const = 0;
Paramètres
pdwNotification
Pointeur vers un DWORD
qui contient la notification actuelle.
pdwNotificationStartTickCount
Pointeur vers un DWORD
qui contient le nombre de graduations pour le début de la notification actuelle.
ppszModule
Pointeur vers une chaîne qui contient le nom du module actif.
pdwModuleStartTickCount
Pointeur vers un DWORD
qui contient le nombre de graduations pour le début du module actif.
pdwAsyncNotification
Pointeur vers un DWORD
qui contient la notification asynchrone actuelle.
pdwAsyncNotificationStartTickCount
Pointeur vers un DWORD
qui contient le nombre de graduations pour le début d’une notification asynchrone.
Valeur renvoyée
Élément HRESULT
. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.
Valeur | Description |
---|---|
NO_ERROR | Indique que l’opération a réussi. |
E_INVALIDARG | Indique qu’un paramètre spécifié n’est pas valide. |
Remarques
Les développeurs peuvent utiliser la GetCurrentExecutionStats
méthode pour récupérer des informations d’exécution spécifiques pour le contexte actuel. Par exemple, les pdwNotification
paramètres et pdwAsyncNotification
contiennent les valeurs de la notification synchrone ou asynchrone actuelle, et le ppszModule
paramètre contient le nom du module pour le contexte actuel.
Trois des paramètres de retour, pdwModuleStartTickCount
, pdwNotificationStartTickCount
et pdwAsyncNotificationStartTickCount
, contiennent respectivement le nombre de cases pour le début du module et le début des notifications synchrones et asynchrones actuelles.
Notes
Le nombre de cases correspond au nombre de millisecondes qui se sont écoulées depuis le démarrage du système. Pour plus d’informations sur la récupération du nombre de graduations, consultez la méthode GetTickCount .
Exemple
L’exemple de code suivant montre comment créer un module HTTP qui effectue les tâches suivantes :
Le module s’inscrit pour les notifications RQ_BEGIN_REQUEST, RQ_MAP_REQUEST_HANDLER et RQ_SEND_RESPONSE .
Le module crée une classe CHttpModule qui contient les méthodes OnBeginRequest, OnMapRequestHandler et OnSendResponse .
Lorsqu’un client Web demande une URL, IIS appelle les méthodes ,
OnMapRequestHandler
etOnSendResponse
duOnBeginRequest
module. Chacune de ces méthodes appelle une méthode privée nomméeRetrieveExecutionStats
qui effectue les tâches suivantes :Récupère les statistiques d’exécution à l’aide de la
GetCurrentExecutionStats
méthode et teste une erreur.Crée une chaîne qui contient le nombre de graduations pour le début de la notification actuelle.
S’interrompt pendant une seconde.
Crée une chaîne qui contient le nombre de graduations écoulés depuis le début de la notification actuelle.
Écrit les statistiques d’exécution en tant qu’événement dans le journal des applications du observateur d'événements.
Le module supprime la classe de la
CHttpModule
mémoire, puis se ferme.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
#include <wchar.h>
// Create the module class.
class MyHttpModule : public CHttpModule
{
private:
// Create a handle for the event viewer.
HANDLE m_hEventLog;
// Define a method the retrieves the current execution statistics.
void RetrieveExecutionStats(
IHttpContext * pHttpContext, LPCSTR szNotification )
{
HRESULT hr = S_OK;
DWORD dwNotification = 0;
DWORD dwNotificationStart = 0;
PCWSTR pszModule = NULL;
// Retrieve the current execution statistics.
hr = pHttpContext->GetCurrentExecutionStats(
&dwNotification,&dwNotificationStart,
&pszModule,NULL,NULL,NULL);
// Test for an error.
if (SUCCEEDED(hr))
{
// Create strings for the statistics.
char szNotificationStart[256];
char szTimeElapsed[256];
// Retrieve and format the statistics.
sprintf_s(szNotificationStart,255,
"Tick count at start of notification: %u",
dwNotificationStart);
// Pause for one second.
Sleep(1000);
// Retrieve and format the statistics.
sprintf_s(szTimeElapsed,255,
"Ticks elapsed since start of notification: %u",
GetTickCount() - dwNotificationStart);
// Allocate space for the module name.
char * pszBuffer = (char*) pHttpContext->AllocateRequestMemory(
(DWORD) wcslen(pszModule)+1 );
// Test for an error.
if (pszBuffer!=NULL)
{
// Return the module information to the web client.
wcstombs(pszBuffer,pszModule,wcslen(pszModule));
// Create an array of strings.
LPCSTR szBuffer[4] = {szNotification,pszBuffer,
szNotificationStart,szTimeElapsed};
// Write the strings to the Event Viewer.
WriteEventViewerLog(szBuffer,4);
}
}
}
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Retrieve and return the execution statistics.
RetrieveExecutionStats(pHttpContext,"OnBeginRequest");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnMapRequestHandler(
IN IHttpContext * pHttpContext,
IN IMapHandlerProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Retrieve and return the execution statistics.
RetrieveExecutionStats(pHttpContext,"OnMapRequestHandler");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnSendResponse(
IN IHttpContext * pHttpContext,
IN ISendResponseProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Retrieve and return the execution statistics.
RetrieveExecutionStats(pHttpContext,"OnSendResponse");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
MyHttpModule()
{
// Open a handle to the Event Viewer.
m_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
}
~MyHttpModule()
{
// Test whether the handle for the Event Viewer is open.
if (NULL != m_hEventLog)
{
// Close the handle to the Event Viewer.
DeregisterEventSource( m_hEventLog );
m_hEventLog = NULL;
}
}
private:
// Define a method that writes to the Event Viewer.
BOOL WriteEventViewerLog(LPCSTR * lpStrings, WORD wNumStrings)
{
// Test whether the handle for the Event Viewer is open.
if (NULL != m_hEventLog)
{
// Write any strings to the Event Viewer and return.
return ReportEvent(
m_hEventLog, EVENTLOG_INFORMATION_TYPE,
0, 0, NULL, wNumStrings, 0, lpStrings, NULL );
}
return FALSE;
}
};
// 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 we 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 );
return pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_BEGIN_REQUEST | RQ_MAP_REQUEST_HANDLER | RQ_SEND_RESPONSE,
0
);
}
Votre module doit exporter la fonction RegisterModule . Vous pouvez exporter cette fonction en créant un fichier de définition de module (.def) pour votre projet, ou vous pouvez compiler le module à l’aide du /EXPORT:RegisterModule
commutateur. Pour plus d’informations, consultez Procédure pas à pas : création d’un module HTTP Request-Level à l’aide de code natif.
Vous pouvez éventuellement compiler le code à l’aide de la __stdcall (/Gz)
convention d’appel au lieu de déclarer explicitement la convention d’appel pour chaque fonction.
Spécifications
Type | Description |
---|---|
Client | - IIS 7.0 sur Windows Vista - IIS 7.5 sur Windows 7 - IIS 8.0 sur Windows 8 - IIS 10.0 sur Windows 10 |
Serveur | - IIS 7.0 sur Windows Server 2008 - IIS 7.5 sur Windows Server 2008 R2 - IIS 8.0 sur Windows Server 2012 - IIS 8.5 sur Windows Server 2012 R2 - IIS 10.0 sur Windows Server 2016 |
Produit | - 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 |
En-tête | Httpserv.h |