2011-02-10 45 views
29

Tengo servidores Windows Server 2003 (IIS 6.0) y Windows Server 2008 (IIS 7.0), y uso MSBuild para implementar aplicaciones web.¿Cómo puedo detener o iniciar un sitio web mediante programación en IIS (6.0 y 7.0) utilizando MsBuild?

tengo que hacer un despliegue seguro, y hacer esto:

  1. detener un sitio web en IIS 6 (o una aplicación en IIS 7), no deje de AppPool.

  2. Compruebe si el sitio web está detenido; no corras.

  3. Si el sitio web está detenido, realice otra tarea para implementar.

  4. Comenzar el sitio web de IIS 6 (o aplicación en IIS 7),

¿Cómo puedo lograr esto?

Actualización: Clave para mí: IIS6WebSite e IIS6AppPool (y para IIS7), ¿espera el estado detenido al intentar detener el sitio web o la AppPool?

Cuando ejecuto Stop Action for Website (o Stop Action for AppPool), necesito estar seguro de que el 100% de ese sitio web está detenido, y luego, y solo si el sitio web está detenido, puedo ejecutar otros objetivos.

+0

Creo que lo que estás buscando es algo así como [MSBuild Extension Pack] (http://msbuildextensionpack.codeplex.com/). Proporciona tareas para iniciar/detener sitios web de IIS (para II6, consulte [Iis6WebSite] (http://www.msbuildextensionpack.com/help/4.0.2.0/html/2849df01-25a8-6f99-5a0c-0fa7a6df5084.htm)). –

+0

+1 mientras que todo aquí "funciona", esta es la mejor manera si solo está usando MSBuild. ¿Por qué reinventar la rueda? –

+0

Clave para mí: Iis6WebSite y IIs6AppPool (y para IIS7), ¿espera el estado detenido al intentar detener WebSite o AppPool? – Kiquenet

Respuesta

1
  • Write a script, p. PowerShell, que detendrá/iniciará el sitio web de IIS programáticamente basándose en el argumento de la línea de comandos, p. start-stop.ps1 /stop 1

  • Ponerlo en la escritura MSBUILD como un paso encargo


Comprobar this para averiguar cómo reiniciar IIS AppPool

IIS WMI objects reference

+1

Solo para tener en cuenta que IIS7 tiene una API administrada, en lugar de depender de 'DirectoryServices' o' WMI': http://learn.iis.net/page.aspx/284/using-managed-apis-in-iis-7/ y http://msdn.microsoft.com/en-us/library/microsoft.web.administration(v=vs.90).aspx –

+0

any sample msbuild and powershell?. Necesito detenerme e iniciar WebSites en iis6, (o sitios en iis7), no appPool. – Kiquenet

37

Mediante la adición de una referencia a Microsoft.Web.Administration (que se puede encontrar en X:\Windows\System32\inetsrv, o el equivalente de su sistema) puede lograr ve buen control de gestión de la situación con IIS7, como se muestrearon a continuación:

namespace StackOverflow 
{ 
    using System; 
    using System.Linq; 
    using Microsoft.Web.Administration; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var server = new ServerManager(); 
      var site = server.Sites.FirstOrDefault(s => s.Name == "Default Web Site"); 
      if (site != null) 
      { 
       //stop the site... 
       site.Stop(); 
       if (site.State == ObjectState.Stopped) 
       { 
        //do deployment tasks... 
       } 
       else 
       { 
        throw new InvalidOperationException("Could not stop website!"); 
       } 
       //restart the site... 
       site.Start(); 
      } 
      else 
      { 
       throw new InvalidOperationException("Could not find website!"); 
      } 
     } 
    } 
} 

Obviamente adaptar esto a sus propias necesidades ya través de su script de implementación acumulación ejecutar la aplicación resultante.

Disfrútalo. :)

+0

¿Puedo usar Microsoft.Web.Administration para Win2003-IIS 6 y VS 2008 .NET 3.5? – Kiquenet

+2

No, esto solo funcionará para IIS7. Necesitará un enfoque diferente para IIS6, como usar 'WMI' o' DirectoryServices'. –

+4

Nota 'Microsoft.Web.Administration' también se puede encontrar en' NuGet' –

0

Así que usted tiene su respuesta anterior para IIS7. Lo que te estás perdiendo es IIS6. Así que aquí tienes. Esto está usando un objeto de interoperabilidad COM ya que eso es todo lo que está disponible para IIS 6. Además, como está en vb, tendrá que descubrir cómo convertirlo. http://www.codeproject.com/Articles/16686/A-C-alternative-for-the-Visual-Basic-GetObject-fun debería llevarlo por el camino correcto. también puedes crear un proyecto vb solo para este código, pero eso es un poco tonto.

Dim WebServiceObj As Object 
dim IisSiteId as Integer = 0 
WebServiceObj = GetObject("IIS://localhost/W3SVC/" & IisSiteId) 
WebServiceObj.Stop() 
WebServiceObj.Start() 
Cuestiones relacionadas