Partager via


Mappage de script générique et pipeline intégré IIS 7

par Ruslan Yakushev

Le grand avantage du pipeline de traitement des requêtes intégré IIS 7 et versions ultérieures est le fait que toutes les fonctionnalités intéressantes de ASP.NET peuvent être utilisées pour n’importe quel type de contenu sur votre site Web ; pas seulement pour le contenu spécifique à ASP.NET. Par exemple, l’appartenance SQL d’ASP.NET peut être utilisée pour protéger les fichiers et dossiers statiques. En outre, les API d’extensibilité d’ASP.NET, telles que IHttpHandler et IHttpModule, peuvent être utilisées pour ajouter des modules et des gestionnaires personnalisés qui seraient exécutés même pour du contenu non-ASP.NET.

IIS 6 n’avait pas ce niveau d’intégration. ASP.NET a été branché à IIS 6 en tant qu’extension ISAPI et par défaut a été configuré pour gérer UNIQUEMENT les requêtes mappées à cette extension, par exemple toute requête qui s’est terminée par « .aspx » serait traitée par l’extension ASP.NET. Cela a évidemment été une grande limitation pour les clients qui voulaient pouvoir utiliser les fonctionnalités ASP.NET pour tout autre contenu sur le site Web. La méthode la plus courante pour contourner ce problème était d’utiliser le « mappage de script générique ». Ce billet explique comment une application qui a utilisé le mappage de script générique dans IIS 6 peut être migrée vers IIS 7 et versions ultérieures.

Supposons que vous aviez configuré ASP.NET dans IIS 6 pour gérer toutes les requêtes à l’aide du mappage de script générique. Par exemple, vous aviez un module ASP.NET pour la réécriture d’URL et vous vouliez que ce module gère les URL sans extension.

Cette configuration de mappage de script générique est généralement effectuée dans le gestionnaire IIS 6 en ouvrant la boîte de dialogue propriétés pour le serveur Web ou le site Web et en sélectionnant l’onglet Répertoire d’accueil, puis en cliquant sur le bouton Configuration, puis en cliquant sur le bouton Insérer pour « Mappages d’applications génériques » :

Screenshot of Application Configuration dialog box and Add and Edit Application Extension Mapping dialog box. Insert button on Application Configuration dialog box is highlighted.

À présent, lorsque vous déplacez votre application vers IIS 7 et versions ultérieures, vous souhaitez la configurer pour obtenir le même comportement de ASP.NET. Il existe deux options sur la façon dont cela peut être effectué : à l’aide du mode de pipeline Classique ou du mode de pipeline Intégré.

Mappage de script générique en mode de pipeline classique dans IIS 7 et versions ultérieures

Avec le mode de pipeline classique, l’ASP.NET est branché au pipeline de traitement des requêtes IIS en tant qu’extension ISAPI, exactement de la même façon que dans IIS 6. En fait, si vous ouvrez %WINDIR%\system32\inetsrv\config\applicationHost.config un fichier et y localisez la <handlers> section à l’intérieur, vous pouvez voir comment IIS est configuré pour mapper les requêtes spécifiques ASP.NET sur le aspnet_isapi.dll :

<handlers accessPolicy="Read, Script">
  ...
  <add name="PageHandlerFactory-ISAPI-2.0" 
       path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
       modules="IsapiModule" 
       scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" 
       preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
  ...
</handlers>

Notez l’attribut preCondition pour le mappage du gestionnaire. Entre autres choses, cet attribut est défini sur classicMode, ce qui garantit que ce mappage de gestionnaires prend effet uniquement lorsque le pool d’applications est configuré pour s’exécuter en mode classique.

Maintenant, si vous souhaitez configurer le mappage générique pour l’ASP.NET en mode classique, vous pouvez le faire en choisissant « Mappages de gestionnaires » dans le Gestionnaire IIS, puis en cliquant sur l’action « Ajouter un mappage de script générique ... ».

Screenshot of Add Wildcard Script Map dialog box and Handler Mappings page. In the Actions pane to the right of Handler Mappings page, Add Wilcard Script Map is highlighted.

Choisissez aspnet_isapi.dll en tant qu’exécutable et donnez à ce mappage de script un nom explicite, tel que ASP.NET-ISAPI-2.0-Wildcard. Après cela, cliquez sur OK, puis sur Oui dans la boîte de dialogue « Ajouter un mappage de script générique ».

Screenshot of Add Wildcard Script Map dialog and Add Wildcard Script Map dialog. In the Add Wildcard Script Map dialog the options Yes, No, and Cancel are shown.

Ensuite, basculez vers l’affichage liste triée pour les mappages de gestionnaires en cliquant sur l’action « Afficher la liste ordonnée ... » et déplacez le nouveau mappage en bas de la liste juste avant le mappage du gestionnaire StaticFile :

Screenshot of Handler Mappings feature page. At the bottom of the handler mappings list view, OPTIONS Verb Handler, A S P dot NET dash I S A P I dash two dot zero dash Wildcard, and Static File are all highlighted.

Si vous ouvrez un fichier web.config et examinez la section <handlers>, vous devez voir que le mappage de script générique pour ASP.NET se trouve juste avant le gestionnaire StaticFile :

<handlers accessPolicy="Read, Script">
  ...
  <add name="ASP.NET-ISAPI-2.0-Wildcard"
     path="*" verb="GET,HEAD,POST,DEBUG"
     modules="IsapiModule"
     scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll"
     preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
  <add name="StaticFile" 
     path="*" verb="*" 
     modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" 
     resourceType="Either" requireAccess="Read" />
</handlers>

L’ordre relatif du mappage de gestionnaire générique est important : si vous définissez ce mappage de gestionnaire après le mappage de gestionnaire « StaticFile », « StaticFile » gère toutes les requêtes et aucune requête n’arrivera jamais au gestionnaire générique ASP.NET.

Comme vous le savez peut-être déjà, le mappage de gestionnaire générique ASP.NET dans IIS 7 et versions ultérieures est soumis aux mêmes limitations de performances que celles qui existaient dans IIS 6. Le problème avec ce type de mappage de gestionnaire est que TOUTES les requêtes sont traitées par celui-ci, y compris les requêtes pour les fichiers statiques. Le gestionnaire de fichier statique ASP.NET n’est pas aussi puissant que le gestionnaire de fichier statique IIS natif. En outre, les fichiers statiques servis par ASP.NET ne seront pas mis en cache par serveur et ils ne seront pas non plus mis en cache par les navigateurs Web. En raison de ces limitations de performances, il est recommandé d’utiliser le pipeline intégré IIS 7 et versions ultérieures pour obtenir les mêmes fonctionnalités qu’avec les mappages génériques dans IIS 6.

Pipeline intégré IIS 7 et versions ultérieures au lieu du mappage de script générique

Avec le pipeline intégré, la fonctionnalité d’ASP.NET est entièrement intégrée au traitement des requêtes principal dans IIS, ce qui signifie que toutes les fonctionnalités d’ASP.NET sont désormais disponibles pour n’importe quel type de requêtes. Cela élimine efficacement la nécessité du mappage de gestionnaire générique. Vous pouvez maintenant utiliser vos modules ASP.NET existants et les appliquer à toutes les requêtes.

Par exemple, supposons que vous disposiez d’un module de réécriture d’URL écrit dans ASP.NET. Sur IIS 6, ce module a été inscrit à l’intérieur de la section <system.web> dans le fichier web.config comme indiqué ci-dessous :

<system.Web>
  <httpModules>
    ...
    <add name="MyUrlRewrite" 
         type="SomeNamespace.MyModules.UrlRewrite, SomeNamespace.MyModules" />
    ...
  </httpModules>
</system.Web>

Étant donné que sur IIS 6, ce module n’était exécuté que pour les requêtes adressées au contenu managé, il ne fonctionnait que pour les URL qui avaient l’extension .aspx, comme http://example.com/archive/2008/08/26/post-title.aspx. Si vous souhaitiez qu’il gère les URL sans extension, vous deviez configurer le mappage de script générique pour ASP.NET. Avec le pipeline intégré IIS 7 et versions ultérieures, vous n’avez plus besoin de le faire. Pour que ce module s’applique aux URL sans extension, vous devez l’inscrire dans la section <system.webServer> à l’intérieur du fichier web.config comme suit :

<system.webServer>
  <modules >
    ...
    <add name="MyUrlRewrite" 
         type="SomeNamespace.MyModules.UrlRewrite, SomeNamespace.MyModules" 
         preCondition="" />
    ...
  </modules>
<system.webServer>

Veillez à laisser l’attribut preCondition vide ici, car il obligerait le module être exécuté pour toutes les requêtes, pas seulement pour les requêtes à contenu spécifique ASP.NET.

L’inscription de vos modules managés de cette façon n’a pas d’impact aussi spectaculaire sur les performances que lors de l’utilisation de mappages de scripts génériques. Même si le module est appelé pour toutes les requêtes adressées à l’application Web, tous les mappages de gestionnaire existants sont toujours en vigueur, ce qui signifie que les fichiers statiques sont toujours servis par le gestionnaire de fichiers statiques IIS natif. Un autre avantage de l’inscription de votre module de cette façon est qu’il peut désormais être appliqué aux requêtes pour PHP, ASP ou toutes autres pages dynamiques. Vous ne pourriez pas le faire si vous utilisiez des mappages de scripts génériques.

-Une dernière chose à mentionner ici est que vous pouvez également utiliser l’attribut sur la section <modules> appelée runAllManagedModulesForAllRequests.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="True" >
    ...
    <add name="MyUrlRewrite" 
         type="SomeNamespace.MyModules.UrlRewrite, SomeNamespace.MyModules" 
         preCondition="ManagedHandler" />
    ...
  </modules>
<system.webServer>

Cet attribut force IIS à ignorer l’attribut preCondition="managedHandler », de sorte que tous les modules managés sont appelés pour toutes les requêtes adressées à l’application Web.