2011-02-10 17 views
29

Tôi có các máy chủ Windows Server 2003 (IIS 6.0) và Windows Server 2008 (IIS 7.0), và tôi sử dụng MSBuild để triển khai các ứng dụng web.Làm thế nào tôi có thể lập trình dừng hoặc bắt đầu một trang web trong IIS (6.0 và 7.0) bằng cách sử dụng MsBuild?

tôi cần phải làm một triển khai an toàn, và làm điều này:

  1. Dừng một trang web trong IIS 6 (hoặc một ứng dụng trong IIS 7), không dừng lại AppPool.

  2. Kiểm tra xem trang web có bị dừng hay không; không chạy.

  3. Nếu trang web bị dừng, hãy thực hiện một tác vụ khác để triển khai.

  4. Khởi động trang web IIS 6 (hoặc ứng dụng trong IIS 7),

Làm thế nào tôi có thể đạt được điều này?

Cập nhật: Khóa cho tôi: IIS6WebSite và IIS6AppPool (và cho IIS7), hãy đợi trạng thái dừng khi thử Dừng Trang web hoặc AppPool?

Khi tôi thực hiện hành động dừng cho trang web (hoặc dừng hành động cho AppPool), tôi cần chắc chắn rằng 100% trang web bị dừng, và sau đó, và chỉ khi trang web bị dừng, tôi có thể thực hiện các mục tiêu khác.

+0

Tôi tin rằng những gì bạn đang tìm kiếm giống như [Gói mở rộng MSBuild] (http://msbuildextensionpack.codeplex.com/). Nó cung cấp các nhiệm vụ để khởi động/dừng các trang web IIS (cho II6 xem [Iis6WebSite] (http://www.msbuildextensionpack.com/help/4.0.2.0/html/2849df01-25a8-6f99-5a0c-0fa7a6df5084.htm)). –

+0

+1 trong khi mọi thứ ở đây "hoạt động", đây là cách tốt nhất nếu bạn chỉ sử dụng MSBuild. Tại sao tái tạo lại bánh xe? –

+0

Key cho tôi: Iis6WebSite và IIs6AppPool (và cho IIS7), hãy đợi trạng thái dừng khi thử Dừng WebSite hoặc AppPool? – Kiquenet

Trả lời

1
  • Write a script, ví dụ: PowerShell, sẽ dừng/khởi động trang web IIS theo lập trình dựa vào đối số dòng lệnh, ví dụ: start-stop.ps1 /stop 1

  • Đặt nó vào MSBuild kịch bản như một bước tùy chỉnh


Kiểm tra this để tìm hiểu làm thế nào để khởi động lại IIS AppPool

IIS WMI objects reference

+1

Chỉ cần lưu ý IIS7 có một API được quản lý, thay vì dựa vào 'DirectoryServices' hoặc' WMI': http://learn.iis.net/page.aspx/284/using-managed-apis-in-iis-7/ và http://msdn.microsoft.com/en-us/library/microsoft.web.administration(v=vs.90).aspx –

+0

bất kỳ mẫu msbuild và powershell nào ?. Tôi cần dừng lại và bắt đầu WebSites trong iis6, (hoặc các trang web trong iis7), không phải appPool. – Kiquenet

37

Bằng cách thêm một tham chiếu đến Microsoft.Web.Administration (có thể được tìm thấy trong X:\Windows\System32\inetsrv hoặc tương đương với hệ thống của bạn) bạn có thể đạt được đã kiểm soát tốt tình hình kiểm soát tình hình với IIS7, như được lấy mẫu dưới đây:

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

Rõ ràng điều chỉnh yêu cầu của riêng bạn và thông qua kịch bản xây dựng triển khai của bạn thực hiện ứng dụng kết quả.

Tận hưởng. :)

+0

Tôi có thể sử dụng Microsoft.Web.Administration cho Win2003-IIS 6 và VS 2008 .NET 3.5 ?? – Kiquenet

+2

Không, điều này sẽ chỉ hoạt động đối với IIS7. Bạn sẽ cần một cách tiếp cận khác cho IIS6, chẳng hạn như sử dụng 'WMI' hoặc' DirectoryServices'. –

+4

Lưu ý 'Microsoft.Web.Administration' cũng có thể được tìm thấy trên' NuGet' –

0

Vì vậy, bạn có câu trả lời ở trên cho IIS7. Những gì bạn đang thiếu là IIS6. Vì vậy, ở đây bạn đi. Điều này là sử dụng một đối tượng interop COM vì đó là tất cả những gì có sẵn cho IIS 6. Ngoài ra, bởi vì nó trong vb, bạn sẽ phải tìm ra cách để chuyển đổi nó. http://www.codeproject.com/Articles/16686/A-C-alternative-for-the-Visual-Basic-GetObject-fun sẽ giúp bạn đi đúng hướng. bạn cũng có thể tạo một dự án vb chỉ cho mã này nhưng đó là loại ngớ ngẩn.

Dim WebServiceObj As Object 
dim IisSiteId as Integer = 0 
WebServiceObj = GetObject("IIS://localhost/W3SVC/" & IisSiteId) 
WebServiceObj.Stop() 
WebServiceObj.Start() 
Các vấn đề liên quan