2010-02-11 11 views
3

J'ai une application implémentée en tant que filtre ISAPI dont le comportement doit changer selon qu'elle est en cours de chargement par ISA ou IIS. Pendant GetFilterVersion, il doit s'enregistrer pour SF_NOTIFY_SEND_RAW_DATA s'il est chargé par ISA ou SF_NOTIFY_SEND_RESPONSE s'il est chargé par IIS.Comment un filtre ISAPI peut-il distinguer entre le chargement par IIS ou ISA?

Il ne semble pas y avoir d'informations sur le serveur transmis à GetFilterVersion. Y a-t-il des astuces qui pourraient identifier et distinguer entre IIS et ISA?

[modifier]

L'application a besoin de savoir quel serveur se charge au moment de l'initialisation, pendant l'appel GetFilterVersion. Il n'y a pas de requête en cours, donc tenter d'obtenir SERVER_VARIABLE à partir de variables d'en-tête ne fonctionnera pas; il n'y a pas de variables d'en-tête à ce stade.

Pour élaborer, mon application définit les en-têtes de réponse, tels que les cookies et les en-têtes de contrôle de cache. Lors de l'exécution dans le contexte d'un serveur ISA, il doit utiliser l'événement SF_NOTIFY_SEND_RAW_DATA pour effectuer cette opération, en modifiant les données brutes envoyées par le proxy ISA. Dans IIS, toutefois, l'utilisation de cette notification s'accompagne d'une pénalité importante en termes de performances. L'application doit donc utiliser SF_NOTIFY_SEND_RESPONSE. SF_NOTIFY_SEND_RESPONSE ne fonctionnera pas avec ISA car cet événement n'est pas déclenché pour les réponses par proxy, mais uniquement pour les réponses provenant de l'ISA lui-même, telles que les pages d'erreur. Enfin, l'enregistrement des événements se produit une fois pendant GetFilterVersion() et ne peut pas être modifié une fois le filtre chargé. L'application doit donc savoir, lors de l'initialisation, quand elle décide d'enregistrer pour SF_NOTIFY_SEND_RESPONSE ou SF_NOTIFY_SEND_RAW_DATA, si elle est en cours de chargement par IIS ou ISA.

Répondre

2

Les versions récentes d'IIS et d'ISA doivent toutes deux fonctionner avec des processus de travail. Le nom "w3proxy.exe" appartient à ISA et "w3wp.exe" à IIS. Acquérir le nom du processus actuel et le tester, voila.

HANDLE winapi GetCurrentProcess()

et this:

DWORD WINAPI GetModuleFileNameEx(
    __in  HANDLE hProcess, 
    __in_opt HMODULE hModule, 
    __out  LPTSTR lpFilename, 
    __in  DWORD nSize 
); 

devrait faire l'affaire

+0

Merci!C'est le genre de chose que je pensais pouvoir exister, mais je ne me souviens pas assez de Windows API ou en savoir assez sur IIS/ISA pour trouver. – veefu

0

Je n'ai écrit que des applications isapi, pas des filtres. mais à partir d'une application ISAPI, vous pouvez appeler et demander GetServerVariable la valeur de « SERVER_SOFTWARE »

voir http://msdn.microsoft.com/en-us/library/ms525335.aspx

si vous ne pouvez pas appeler « GetServerVariable » d'un filtre, alors je ne sais pas comment faire il.

-Don

+0

Merci pour la réponse. Malheureusement, GetServerVariable n'est pas appelable au point où le filtre a besoin des informations. GetFilterVersion est implémenté par mon filtre ISAPI et est appelé une fois lorsque IIS/ISA charge le filtre. C'est l'opportunité pour le filtre de dire à IIS les notifications d'événements dont il a besoin. Un handle HCONN n'est pas transmis à cette fonction car cela se produit avant la connexion des clients. Au moment où une connexion client est établie et que GetSErverVariable peut être appelée, il est trop tard pour que le filtre modifie ses notifications d'événements. – veefu

0

vous pourriez être en mesure d'obtenir SERVER_SOFTWARE (ou une autre variable indiquant ISA par rapport à IIS) de l'environnement par l'intermédiaire getenv().