MVAESTECH
Guide .NET · 10 · Hébergement

Publié le · par Mathieu Vaes

IIS sous Windows

IIS n'est pas un simple serveur web : c'est un gestionnaire de processus. Comprendre qui écoute, qui démarre quoi et qui recycle quand, c'est diagnostiquer une erreur 502.5 en cinq minutes au lieu d'une journée.

Chapitres du guide
En clair

IIS est le serveur web de Windows. Il reçoit les requêtes, les distribue aux applications, et redémarre une appli qui plante. Chaque appli tourne dans un « pool d'applications », un processus isolé, pour qu'un crash n'emporte pas les applis voisines.

Le trajet d'une requête Confirmé

ClientHTTPS :443 MODE UTILISATEUR — WAS (démarre/arrête les w3wp) · W3SVC (configure HTTP.sys) · applicationHost.config HTTP.sysnoyau Windowsfile par pool, TLS w3wp.exepool d'applications « No Managed Code » · identité ApplicationPoolIdentity ANCMASP.NET CoreModule V2 IIS HTTP ServerIISHttpServermême processus Votre applipipeline + endpoints Un seul processus : pas de saut réseau, meilleur débit. Une appli in-process par pool. Proxy inversedans ANCMHTTP local dotnet.exeKestrelprocessus séparé ANCM lance et surveille Kestrel puis relaie la requête : isolation, mais un saut supplémentaire.
HTTP.sys reçoit la requête dans le noyau et la place dans la file du pool d'applications. WAS démarre le processus w3wp.exe à la première requête, où l'ASP.NET Core Module charge votre appli.
ComposantRôle
HTTP.sysPilote noyau : écoute les ports, termine TLS, met en file par pool, sert le cache noyau
WASWindows Process Activation Service : crée, surveille et recycle les processus de travail
W3SVCService web : lit la configuration et programme HTTP.sys
Pool d'applicationsFrontière d'isolation : un ou plusieurs w3wp.exe, une identité, des règles de recyclage
ANCMModule natif IIS fourni par le .NET Hosting Bundle, charge l'appli ASP.NET Core
applicationHost.configConfiguration du serveur (%windir%\System32\inetsrv\config) ; web.config au niveau de l'appli

Réglages du pool d'applications Senior

ParamètreDéfautRecommandation
Version du CLR .NETv4.0No Managed Code pour ASP.NET Core ; v4.0 pour .NET Framework
IdentitéApplicationPoolIdentityLa garder ; donner les droits NTFS à IIS AppPool\NomDuPool ; compte de service géré (gMSA) pour accéder à SQL Server en auth Windows
Recyclage périodique1 740 min (29 h)Le remplacer par une heure fixe hors trafic, ou le désactiver si l'appli est saine
Délai d'inactivité20 min0 pour une API qui doit répondre vite après une période calme
Mode de démarrageOnDemandAlwaysRunning + preloadEnabled sur le site (module Application Initialization)
Protection contre les échecs rapides5 échecs en 5 minLa garder : le pool s'arrête au lieu de boucler
Nombre max. de processus (web garden)11, sauf appli sans état en mémoire

web.config généré par dotnet publish (in-process)

<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\Shop.Api.dll"
                  hostingModel="inprocess" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

Déployer sans casser

  1. Déposer un fichier app_offline.htm à la racine : ANCM arrête l'appli et sert ce fichier (libère les DLL verrouillées).
  2. Copier la nouvelle publication (Web Deploy, robocopy, pipeline CI).
  3. Supprimer app_offline.htm : l'appli redémarre à la requête suivante.
  4. Pour zéro interruption : deux sites derrière ARR / un load balancer, bascule bleu-vert.

Diagnostiquer les erreurs ANCM

ErreurCause fréquenteOù regarder
500.19Module ANCM absent : Hosting Bundle non installé (ou installé avant IIS)Réinstaller le Hosting Bundle, iisreset
500.30L'appli in-process plante au démarrage (config, secret manquant, exception dans Program.cs)Observateur d'événements → Application ; activer stdoutLogEnabled temporairement
500.31Runtime .NET requis introuvableVersion du Hosting Bundle vs TargetFramework
500.35Deux applis in-process dans le même poolUn pool par appli
502.5Out-of-process : le processus dotnet ne démarre pasJournaux stdout, chemin processPath
503Pool arrêté (protection contre les échecs rapides)Gestionnaire IIS → pools, puis cause racine
ASP.NET classique (.NET Framework)

Une appli ASP.NET MVC 5 / Web Forms tourne dans le pipeline intégré d'IIS : System.Web, HttpModule, HttpHandler, Global.asax, pool en CLR v4.0. L'état de session in-proc et le cache HttpRuntime disparaissent à chaque recyclage : pour une ferme ou un recyclage sans douleur, session en SQL Server ou State Server, et machineKey identique sur tous les serveurs. Migration vers ASP.NET Core : progressive avec YARP et l'approche « strangler fig » (le nouveau site relaie vers l'ancien les routes non migrées).

Piège
  • Hosting Bundle installé avant IIS : ANCM n'est pas enregistré. Réparer le Hosting Bundle après l'ajout du rôle IIS.
  • Clés Data Protection : sans profil utilisateur chargé (Load User Profile = false), les clés ne sont pas persistées et les cookies d'auth deviennent invalides après chaque recyclage. Persister les clés explicitement.
  • Derrière un reverse proxy / load balancer : sans UseForwardedHeaders configuré (et les KnownProxies), l'appli voit l'IP du proxy et le schéma HTTP.
  • Web garden + cache mémoire : chaque processus a son propre cache et ses propres verrous.

À retenir

  • HTTP.sys écoute, WAS gère les processus, ANCM charge l'appli dans w3wp.exe.
  • In-process par défaut, un pool par appli, « No Managed Code ».
  • Recyclage maîtrisé, AlwaysRunning pour les API, Data Protection persistée.

Un projet .NET à cadrer ou à reprendre ?

API REST documentées et testées, applications ASP.NET MVC (y compris VB.NET), migration de services anciens vers une architecture claire : parlons de votre code.