我创建了一个应用程序,该应用程序在IIS中获取我的所有站点,并检查绑定中的每个URL,如果出现HTTP错误并且遇到某个错误,我的应用程序将在IIS中重置IIS站点实例,但是,这还不足以修复错误。我需要重置站点及其所属的应用程序池。
有没有办法获取基于站点对象的应用程序池对象?
我已经尝试了下面的代码,但这仅在应用程序池中只有 1 个站点/应用程序时才有效。问题是,如果我在站点列表与应用程序池列表之间存在数字不匹配,则我无法获得站点的匹配应用程序池,因为 1 个应用程序池可以有多个站点/应用程序。
ServerManager serverMgr = new ServerManager();
SiteCollection sites;
ApplicationPoolCollection appPools;
public List<(Site, ApplicationPool, string)> getSiteInfo()
{
List<(Site, ApplicationPool, string)> siteInfo = new List<(Site, ApplicationPool, string)>();
List<string> siteUrls = new List<string>();
sites = serverMgr.Sites;
appPools = serverMgr.ApplicationPools;
foreach (Site site in sites)
{
foreach (ApplicationPool appPool in appPools)
{
foreach (Binding binding in site.Bindings)//getting site url
{
string bindingInfo = binding.BindingInformation; // "192.111.1.1:80:google.com" /// *:808:
string[] adrs = bindingInfo.Split(':'); //0 = ip, 1 = port, 2 = hostname
if (adrs[0] == "*")
{
adrs[0] = "localhost";
}
//adding to my list of sites and it's corresponding Application Pool in 1 tuple variable
siteInfo.Add((site, appPool, adrs[0] + ":" + adrs[1] + "/" + adrs[2])); //localhost:80/google.com
}
}
}
return siteInfo;
}
我需要类似于此代码的内容:(请参阅注释(
public List<(Site, ApplicationPool, string)> getSiteInfo()
{
List<(Site, ApplicationPool, string)> siteInfo = new List<(Site, ApplicationPool, string)>();
List<string> siteUrls = new List<string>();
sites = serverMgr.Sites;
foreach (Site site in sites)
{
foreach (Binding binding in site.Bindings)
{
//I need something like this to make sure the AppPool I'm getting is of the Site I have.
ApplicationPool appPool = site.ApplicationPoolName;//<-- This Line
string bindingInfo = binding.BindingInformation;
string[] adrs = bindingInfo.Split(':');
if (adrs[0] == "*")
{
adrs[0] = "localhost";
}
//So that I can do this when passing the Site Info tuple Variable with the Site Object together with the corresponding AppPool for later use of the IISReset Class in my project.
siteInfo.Add((site, appPool, adrs[0] + ":" + adrs[1] + "/" + adrs[2]));
}
}
return siteInfo;
}
很抱歉解释冗长而草率,但如果您对此有疑问,我很乐意清除。谢谢。
我通过使用站点的"应用程序"属性解决了这个问题。为了获取站点的应用程序池,我执行了下面的代码。我获取站点的应用程序列表并使用它来从服务器中的应用程序池列表中标识应用程序池的位置。但是,这仅在站点只有 1 个应用程序时才有效,这就是为什么我索引 0(零(以获取第一个应用程序(这是我网站的唯一应用程序(来搜索其相应的应用程序池。
ApplicationCollection apps = site.Applications;
ApplicationPool appPool = serverMgr.ApplicationPools[appname[0].ApplicationPoolName];