2010-08-17 20 views
6

Mi situación: cuando implemento ensamblados .NET en GAC, obtengo errores (No se puede acceder a xxx.dll porque está en uso para otro proceso). IIS usa esos dll (ensamblados).Detener e iniciar IIS programáticamente. Forma rápida y segura

¿Cuál es la mejor manera (más rendimiento, manera rápida y segura) o todas las formas de detener, iniciar IIS 6.0 Windows 2003? (Para C#, .NET 3.5)

opciones, pienso:

  1. Detectar IIS instalado en la máquina.

  2. Process.Start() utilizando comandos: iisreset /stop y iisreset /start

  3. clase Uso ServiceController para conseguir "World Wide Web servicio de publicación" ("W3SVC") y se detienen

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

    y empiezan

    controller.Start(); 
    controller.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(timeoutSeconds)); 
    
  4. Process.Start() usando el comando: taskkill/IM aspnet_wp.exe/F (use w3wp.exe en Win2003)

  5. ¿otras opciones que no conozco?

Respuesta

5

No es necesario que haga todas estas cosas.

Usando simplemente iisreset /stop luego iisreset /start cuando haya terminado su despliegue funcionará.

Es bastante rápido y garantiza un reinicio seguro de IIS.

Editar:

Puede llevar a cabo la configuración completa de sitios web y directorios virtuales utilizando WiX.

muestra de Wix para la creación de un sitio web en IIS (no funcionará tal cual):

<!-- 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> 

Para otro ejemplo ver aquí:

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

+0

Si sólo necesita para reciclar los servicios: 'iisreset/restart'. Y tenga en cuenta en Win2k8/Vista y más tarde esto debe ser de un comando elevado/indicador de PowerShell. – Richard

+0

Personalmente, desplegaría los archivos usando un instalador de WiX que me ordenaría todas estas cosas y permitiría una implementación rápida en un nuevo servidor si fuera necesario. – fletcher

+0

@Richard: cualquier comando de muestra/PowerShell? @fletcher: ¿alguna muestra de WIX? Yo uso script Msbuild para implementación. – 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 
    } 
} 
Cuestiones relacionadas