IIS : Les DLL de filtre ISAPI


Les filtres ISAPI captent les évenement de tout le serveur IIS. Ils s'inscrivent dans une liste, traite un évènement et le passe au suivant et ainsi de suite. L'enregistrement d'un filtre se fait dans les propriétés du serveur:

 

 

 

Sélectionnez l'onglet Filtres ISAPI et ajouter votre propre filtre.

 

 

 

Le filtre qui va être réalisé est très simple. Il ne capte que les évènement LOG. Ces même évènements sont captés par le serveur et génère une trace d'extension LOG par défaut dans C:\Winnt\System32\LogFiles\W3SVC1. Voici à quoi ressemble ce fichier:

#Software: Microsoft Internet Information Server 4.0
#Version: 1.0
#Date: 2001-01-04 16:44:47
#Fields: time c-ip cs-method cs-uri-stem sc-status
16:44:47 169.227.100.54 GET /cpi 401
16:44:47 169.227.100.54 GET /cpi/ 302
16:44:47 169.227.100.54 GET /cpi/ 401
16:44:47 169.227.100.54 GET /cpi/index.html 304
16:44:47 169.227.100.54 GET /cpi/images/cp.gif 401
16:44:47 169.227.100.54 GET /cpi/images/mcsd.gif 401
16:44:47 169.227.100.54 GET /cpi/images/cp.gif 304
16:44:47 169.227.100.54 GET /cpi/bart/Bartman.gif 401
16:44:47 169.227.100.54 GET /cpi/images/mcsd.gif 304
...
Pour réaliser le même type de fichier, le filtre doit s'enregistrer et préciser les évènements qu'il souhaite recevoir. Si le filtre est réaliser en utilisant l'assisant ISAPI des MFC. Le code est totalement généré et il ne suffit que de remplir les fonctions données:
DWORD CTraceLogFilter::OnLog(CHttpFilterContext *pCtxt, PHTTP_FILTER_LOG pLog)
{
	// TODO: React to this notification accordingly and
	// return the appropriate status code
	CString str;
	str = CString("Log: ") + pLog->pszTarget + "; " + pLog->pszParameters;

	CStdioFile f;
	if( f.Open("D:\\dev\\cpi\\Divers\\IIS\\Trace\\filter.txt", CFile::typeText | CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate) )
	{
		f.SeekToEnd();
		f.WriteString(str);
		f.WriteString("\n");
		f.Close();
	}
	return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
Chaque évènement qui est reçu par le filtre est inscrit dans le fichier de trace:
Log: /cpi; 
Log: /cpi/; 
Log: /cpi/; 
Log: /cpi/index.html; 
Log: /cpi/images/cp.gif; 
Log: /cpi/images/mcsd.gif; 
Log: /cpi/images/cp.gif; 
Log: /cpi/bart/Bartman.gif; 
Log: /cpi/images/mcsd.gif; 
...

© 2001 Christophe Pichaud. All rights reserved.