如何使用 MsBuild 以编程方式在 IIS(6.0 和 7.0)中停止或启动网站?

Posted

技术标签:

【中文标题】如何使用 MsBuild 以编程方式在 IIS(6.0 和 7.0)中停止或启动网站?【英文标题】:How can I programmatically stop or start a website in IIS (6.0 and 7.0) using MsBuild? 【发布时间】:2011-06-24 22:24:43 【问题描述】:

我有 Windows Server 2003 (IIS 6.0) 和 Windows Server 2008 (IIS 7.0) 服务器,我使用 MSBuild 来部署 Web 应用程序。

我需要进行安全部署,然后这样做:

    在 IIS 6 中停止网站(或在 IIS 7 中停止应用程序),而不是停止 AppPool。

    检查网站是否停止;没有运行。

    如果网站停止,请执行另一项部署任务。

    启动网站 IIS 6(或 IIS 7 中的应用程序),

我怎样才能做到这一点?

更新:我的关键:IIS6WebSite 和 IIS6AppPool(以及 IIS7),尝试停止网站或 AppPool 时是否等待停止状态?

当我对网站执行停止操作(或对 AppPool 执行停止操作)时,我需要确保 100% 停止网站,然后,并且只有在网站停止时,我才能执行其他目标。

【问题讨论】:

我相信您正在寻找类似MSBuild Extension Pack 的东西。它提供启动/停止 IIS 网站的任务(对于 II6,请参阅Iis6WebSite)。 +1 虽然这里的一切都“有效”,但如果您只是使用 MSBuild,这是最好的方法。为什么要重新发明***? 对我来说的关键:Iis6WebSite 和 IIs6AppPool(以及 IIS7),尝试 Stop WebSite 或 AppPool 时是否等待停止状态? 使用 MSBuild 扩展包,如何知道 WebSite 或 AppPool (IIS6) 的状态(已启动、已停止...)?? @alhambraeidos - 一种选择是使用 HttpWebRequest 任务来查看是否返回 404(我猜这会假设站点已关闭/停止)? 【参考方案1】:

通过添加对Microsoft.Web.Administration 的引用(可以在X:\Windows\System32\inetsrv 或您的系统中找到),您可以使用 IIS7 实现对情况的良好托管控制,示例如下:

namespace ***

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

显然根据您自己的要求定制它,并通过您的部署构建脚本执行生成的应用程序。

享受。 :)

【讨论】:

我可以为 Win2003-IIS 6 和 VS 2008 .NET 3.5 使用 Microsoft.Web.Administration 吗?? 不,这仅适用于 IIS7。对于 IIS6,您需要使用不同的方法,例如使用 WMIDirectoryServices 注意Microsoft.Web.Administration也可以在NuGet上找到 你有没有通过winforms cefsharp运行网站的想法 很好的答案。谢谢!就我而言,我发现我还需要停止和启动应用程序池。【参考方案2】:

Write a script,例如PowerShell,它将依靠命令行参数以编程方式停止/启动 IIS 网站,例如start-stop.ps1 /stop 1

将其作为自定义步骤放入 MsBuild 脚本中


查看this 了解如何重启 IIS AppPool

IIS WMI objects reference

【讨论】:

请注意 IIS7 有一个托管 API,而不是依赖于 DirectoryServicesWMI:learn.iis.net/page.aspx/284/using-managed-apis-in-iis-7 和 msdn.microsoft.com/en-us/library/… 任何示例 msbuild 和 powershell ?我需要停止和启动 iis6 中的网站(或 iis7 中的网站),而不是 appPool。【参考方案3】:

所以你有上面关于 IIS7 的答案。您缺少的是 IIS6。所以给你。这是使用 COM 互操作对象,因为这就是 IIS 6 可用的全部内容。此外,因为它在 vb 中,您必须弄清楚如何转换它。 http://www.codeproject.com/Articles/16686/A-C-alternative-for-the-Visual-Basic-GetObject-fun 应该让您走上正轨。你也可以为这段代码创建一个 vb 项目,但这有点傻。

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

【讨论】:

以上是关于如何使用 MsBuild 以编程方式在 IIS(6.0 和 7.0)中停止或启动网站?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更改IIS网站的SSL设置

如何从 .NET 类中以编程方式访问服务器级 IIS 连接设置?

以编程方式读取 IIS 7 网站的 TCP 端口

如何以编程方式检测我的应用程序是不是在 ASP.NET 页面内以 IIS 7.0 集成模式运行

如何以编程方式在 COM+ 应用程序中检查“允许 IIS 内在属性”?

以编程方式将 IIS 应用程序池标识“用户”分配给组