如何使用 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,您需要使用不同的方法,例如使用WMI
或 DirectoryServices
。
注意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,而不是依赖于DirectoryServices
或 WMI
: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)中停止或启动网站?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 .NET 类中以编程方式访问服务器级 IIS 连接设置?
如何以编程方式检测我的应用程序是不是在 ASP.NET 页面内以 IIS 7.0 集成模式运行