Ho 以编程方式使服务器脱机/使服务器联机 IIS Web 场服务器
Ho to take server offline / bring server online IIS web farm server programmatically
我正在开发一个 C# 应用程序来自动化将网站部署到 server.The 网站的过程,该网站托管在 WINDOWS SERVER 2012 R2 中的网络场中。所以这里的问题是我试图通过某种编程接口使服务器脱机或使其联机。但我在 Microsoft 文档中找不到任何相关内容。我如何完成工作?
更新:
按照 Timur 的建议,我做了以下操作,但没有成功。
ServiceController p = new ServiceController("W3SVC","SERVER_IP");
p.Start();
p.WaitForStatus(ServiceControllerStatus.Running);
IIS 是一项 Windows 服务。因此,start/stop 最简单的方法是按照 SO answer.
的方式做一些事情
您将 looking for service name,这可能取决于您的版本。
UPD 查看艺术家对您的管理工具的印象
var hostNames = new List<string> { "appServer1", "webServer1", "webServer2" };
foreach (var host in hostNames)
{
var svc = new ServiceController("W3SVC", host);
svc.Stop();
svc.WaitForStatus(ServiceControllerStatus.Stopped);
Thread.Sleep(10000);// or your custom logic
svc.Start();
svc.WaitForStatus(ServiceControllerStatus.Running);
}
请记住,您需要 运行 作为具有足够权限的用户才能成功更改服务状态:因为您需要 运行 作为管理员。
您至少有两种选择:
运行 你的 IDE 作为管理员
按照说明更新您的应用程序清单in this answer
UPD2 显然你可以连接 WFF 控制器 like so
这是配置管理器生成的样本。它通过更改网络场集合中服务器项的启用 属性 来占用服务器 offline/online。
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection webFarmsSection = config.GetSection("webFarms");
ConfigurationElementCollection webFarmsCollection = webFarmsSection.GetCollection();
ConfigurationElement webFarmElement = FindElement(webFarmsCollection, "webFarm", "name", @"123213");
if (webFarmElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElementCollection webFarmCollection = webFarmElement.GetCollection();
ConfigurationElement serverElement = FindElement(webFarmCollection, "server", "address", @"11.1.1.1");
if (serverElement == null) throw new InvalidOperationException("Element not found!");
serverElement["enabled"] = false;
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}
我正在开发一个 C# 应用程序来自动化将网站部署到 server.The 网站的过程,该网站托管在 WINDOWS SERVER 2012 R2 中的网络场中。所以这里的问题是我试图通过某种编程接口使服务器脱机或使其联机。但我在 Microsoft 文档中找不到任何相关内容。我如何完成工作?
更新:
按照 Timur 的建议,我做了以下操作,但没有成功。
ServiceController p = new ServiceController("W3SVC","SERVER_IP");
p.Start();
p.WaitForStatus(ServiceControllerStatus.Running);
IIS 是一项 Windows 服务。因此,start/stop 最简单的方法是按照 SO answer.
的方式做一些事情您将 looking for service name,这可能取决于您的版本。
UPD 查看艺术家对您的管理工具的印象
var hostNames = new List<string> { "appServer1", "webServer1", "webServer2" };
foreach (var host in hostNames)
{
var svc = new ServiceController("W3SVC", host);
svc.Stop();
svc.WaitForStatus(ServiceControllerStatus.Stopped);
Thread.Sleep(10000);// or your custom logic
svc.Start();
svc.WaitForStatus(ServiceControllerStatus.Running);
}
请记住,您需要 运行 作为具有足够权限的用户才能成功更改服务状态:因为您需要 运行 作为管理员。 您至少有两种选择:
运行 你的 IDE 作为管理员
按照说明更新您的应用程序清单in this answer
UPD2 显然你可以连接 WFF 控制器 like so
这是配置管理器生成的样本。它通过更改网络场集合中服务器项的启用 属性 来占用服务器 offline/online。
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection webFarmsSection = config.GetSection("webFarms");
ConfigurationElementCollection webFarmsCollection = webFarmsSection.GetCollection();
ConfigurationElement webFarmElement = FindElement(webFarmsCollection, "webFarm", "name", @"123213");
if (webFarmElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElementCollection webFarmCollection = webFarmElement.GetCollection();
ConfigurationElement serverElement = FindElement(webFarmCollection, "server", "address", @"11.1.1.1");
if (serverElement == null) throw new InvalidOperationException("Element not found!");
serverElement["enabled"] = false;
serverManager.CommitChanges();
}
}
private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
{
foreach (ConfigurationElement element in collection)
{
if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
{
bool matches = true;
for (int i = 0; i < keyValues.Length; i += 2)
{
object o = element.GetAttributeValue(keyValues[i]);
string value = null;
if (o != null)
{
value = o.ToString();
}
if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
{
matches = false;
break;
}
}
if (matches)
{
return element;
}
}
}
return null;
}
}