2011-02-10 11 views
29

Ho server Windows Server 2003 (IIS 6.0) e Windows Server 2008 (IIS 7.0) e utilizzo MSBuild per la distribuzione di applicazioni Web.Come posso interrompere o avviare a livello di codice un sito Web in IIS (6.0 e 7.0) utilizzando MsBuild?

ho bisogno di fare un deploy di sicurezza, e fare questo:

  1. fermare un sito Web in IIS 6 (o un'applicazione in IIS 7), non si fermano AppPool.

  2. Verificare se il sito Web è stato arrestato; non correndo.

  3. Se il sito Web viene arrestato, eseguire un'altra operazione per la distribuzione.

  4. Avviare il sito Web IIS 6 (o applicazione in IIS 7),

Come posso raggiungere questo obiettivo?

Aggiornamento: Chiave per me: IIS6WebSite e IIS6AppPool (e per IIS7), attendere lo stato di arresto quando si tenta di arrestare Sito Web o AppPool?

Quando eseguo Stop Action per sito Web (o Stop Action per AppPool), ho bisogno di essere sicuro al 100% che il sito Web sia stato arrestato, e quindi, solo se il sito Web viene interrotto, posso eseguire altri obiettivi.

+0

Credo che ciò che stai cercando è qualcosa di simile [Extension Pack MSBuild] (http://msbuildextensionpack.codeplex.com/). Fornisce le attività per avviare/arrestare i siti Web IIS (per II6 vedere [Iis6WebSite] (http://www.msbuildextensionpack.com/help/4.0.2.0/html/2849df01-25a8-6f99-5a0c-0fa7a6df5084.htm)). –

+0

+1 mentre tutto qui "funziona", questo è il modo migliore se stai usando MSBuild. Perché reinventare la ruota? –

+0

Chiave per me: Iis6WebSite e IIs6AppPool (e per IIS7), attendere lo stato di arresto quando si tenta di interrompere WebSite o AppPool? – Kiquenet

risposta

1
  • Write a script, ad es. PowerShell, che arresta/avvia il sito Web IIS facendo affidamento programmatico sull'argomento della riga di comando, ad es. start-stop.ps1 /stop 1

  • Metterlo in script MsBuild come un passo personalizzato


Controllare this per scoprire come riavviare IIS AppPool

IIS WMI objects reference

+1

Solo per notare IIS7 ha un'API gestita, piuttosto che fare affidamento su 'DirectoryServices' o' WMI': http://learn.iis.net/page.aspx/284/using-managed-apis-in-iis-7/ e http://msdn.microsoft.com/en-us/library/microsoft.web.administration(v=vs.90).aspx –

+0

qualsiasi esempio di msbuild e powershell ?. Ho bisogno di fermarmi e avviare WebSites in iis6, (o siti in iis7), non in appPool. – Kiquenet

37

Con l'aggiunta di un riferimento alla Microsoft.Web.Administration (che può essere trovato in X:\Windows\System32\inetsrv, o equivalente al tuo sistema) puoi achie ve bel controllo gestito la situazione con IIS7, come campionati di seguito:

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!"); 
      } 
     } 
    } 
} 

Ovviamente adattare questo alle proprie esigenze e attraverso il vostro script di distribuzione di build eseguire l'applicazione risultante.

Divertiti. :)

+0

Posso utilizzare Microsoft.Web.Administration per Win2003-IIS 6 e VS 2008 .NET 3.5 ?? – Kiquenet

+2

No, funziona solo con IIS7. Avrai bisogno di un approccio diverso per IIS6, come l'uso di 'WMI' o' DirectoryServices'. –

+4

Nota 'Microsoft.Web.Administration' può anche essere trovato su' NuGet' –

0

Quindi hai la tua risposta sopra per IIS7. Quello che ti manca è IIS6. Quindi qui vai. Questo sta usando un oggetto di interoperabilità COM in quanto è tutto ciò che è disponibile per IIS 6. Inoltre, poiché è in vb, dovrai capire come convertirlo. http://www.codeproject.com/Articles/16686/A-C-alternative-for-the-Visual-Basic-GetObject-fun dovrebbe portarti sulla strada giusta. potresti anche creare un progetto vb solo per questo codice, ma è piuttosto stupido.

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