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

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

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

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

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

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

  4. 启动网站 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(我猜这会假设站点已关闭/停止)?

标签: c# iis-7 msbuild iis-6 web-deployment


【解决方案1】:

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

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

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

享受。 :)

【讨论】:

  • 我可以为 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

【讨论】:

【解决方案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()

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多