2010-08-17 6 views
6

Ma situation: lorsque je déploie des assemblys .NET dans GAC, j'obtiens des erreurs (Impossible d'accéder à xxx.dll car il est utilisé pour un autre processus). L'IIS utilise ces dll (assemblages).Arrêtez et démarrez IIS par programmation. Façon rapide et sûre

Quelle est la meilleure façon (plus de performance, de manière rapide et sûre) ou tous les moyens d'arrêter, démarrer IIS 6.0 Windows 2003? (C#, .NET 3.5)

options, je pense:

  1. IIS Detect installé dans la machine.

  2. Process.Start() en utilisant des commandes: iisreset /stop et iisreset /start

  3. Utilisez la classe ServiceController pour get "Service de publication Web" ("W3SVC") et ne vous arrêtez

    controller.Stop(); 
    controller.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(timeoutSeconds)); 
    

    et ne commencent

    controller.Start(); 
    controller.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(timeoutSeconds)); 
    
  4. Process.Start() en utilisant la commande: taskkill/IM aspnet_wp.exe/F (utiliser w3wp.exe dans Win2003)

  5. une autre option que je ne connais pas?

Répondre

5

Vous n'avez pas besoin de faire toutes ces choses.

En utilisant seulement iisreset /stop puis iisreset /start lorsque vous avez terminé votre déploiement fonctionnera.

Il est assez rapide et garantit un redémarrage sûr d'IIS.

Edit:

Vous pouvez effectuer la configuration complète des sites Web et des répertoires virtuels à l'aide WiX.

échantillon Wix pour créer un site Web dans IIS (ne fonctionnera pas tel quel):

<!-- Create the web site in IIS --> 
<Component Id="WebSiteComponent" Guid="<INSERT-GUID>" KeyPath="yes"> 
    <iis:WebAppPool Id="WebSiteAppPool" Name="WebSiteAppPool" RecycleMinutes="1740" QueueLimit="4000" IdleTimeout="20" MaxWorkerProcesses="1" Identity="networkService" /> 
    <!-- web site --> 
    <iis:WebSite Id="WebSiteIIS" AutoStart="yes" ConfigureIfExists="yes" Description="WebSite" SiteId="59" StartOnInstall="yes" Directory="SiteFolder"> 
    <!-- Host headers to enable web site to be hosted on port 80 --> 
    <iis:WebAddress Id="HostHeader" Header="myWebSite" IP="*" Port="80" Secure="no" /> 
    <iis:WebAddress Id="SecureHostHeader" Header="myWebSite" IP="*" Port="443" Secure="yes" /> 
    <!-- download web site web application --> 
    <iis:WebApplication Id="WebSiteWebApplication" AllowSessions="yes" SessionTimeout="20" Buffer="yes" ParentPaths="no" ClientDebugging="no" Name="Default Application" WebAppPool="WebSiteAppPool" DefaultScript="VBScript" ScriptTimeout="90" ServerDebugging="no" /> 
    <iis:WebDirProperties Id="WebSiteProperties" Read="yes" LogVisits="yes" Index="yes" Execute="no" Write="no" AnonymousAccess="yes" AccessSSL="no" Script="yes" AspDetailedError="yes" /> 
    <!-- web service virtual directory --> 
    <iis:WebVirtualDir Id="WebServiceVDir" Alias="Service" Directory="WebServiceFolder"> 
    <iis:WebDirProperties Id="WebServiceVDirProperties" Read="yes" Write="yes" LogVisits="yes" Index="yes" BasicAuthentication="yes" AnonymousAccess="no" AccessSSL="yes" AccessSSL128="yes" Execute="no" Script="yes" AspDetailedError="yes" /> 
    <iis:WebApplication Id="WebServiceWebApplication" AllowSessions="yes" Buffer="yes" ClientDebugging="no" ServerDebugging="no" WebAppPool="WebSiteAppPool" Name="Default Application" SessionTimeout="20" ParentPaths="no" DefaultScript="VBScript" ScriptTimeout="90" /> 
    </iis:WebVirtualDir> 
</iis:WebSite> 
</Component> 

Pour un autre exemple, voir ici:

http://strangelights.com/blog/archive/2004/10/08/179.aspx

+0

Si vous avez juste besoin de recycler les services: 'iisreset/restart'. Et notez sur Win2k8/Vista et plus tard cela doit être à partir d'une invite de commande/PowerShell élevée. – Richard

+0

Personnellement, je voudrais déployer les fichiers en utilisant un installateur WiX qui va trier tout cela pour moi et permettre un déploiement rapide vers un nouveau serveur si je dois le faire. – fletcher

+0

@Richard: un exemple de commande/PowerShell? @fletcher: des exemples de WIX? J'utilise le script Msbuild pour le déploiement. – Kiquenet

2
# IISReset.ps1 - using PowerShell 
[array] $services = ('W3SVC','SMTPSVC','IISAdmin') 
foreach($service in $services) 
{ 
    $tst = Get-Service $service -ErrorAction SilentlyContinue 
    if($tst -ne $null) 
    { 
     Write-Host $service 
     Stop-Service -Name $service 
    } 
} 

[array]::Reverse($services) 
foreach($service in $services) 
{ 
    $tst = Get-Service $service -ErrorAction SilentlyContinue 
    if($tst -ne $null) 
    { 
     Write-Host $service 
     Start-Service -Name $service 
    } 
}