【发布时间】:2022-01-12 22:41:03
【问题描述】:
在我的 IIS 设置中有两个站点: 默认网站,在其下有许多 Web 应用程序;和另一个网站“ABC”。
我正在尝试从默认网站中的 Web 应用程序获取 ABC 的绑定信息(协议和端口),但我遇到了障碍!我确实得到了我需要的信息,但不是来自我需要的网站。
据我了解,该信息来自位于 C:\Windows\System32\inetsrv\config 中的“applicationHost.config”。我检查了这个文件,我可以看到 Default Web Site 和 ABC 作为站点。
这是我用来获取端口和协议的:
private Dictionary<string, string> GetBindings()
{
// Get the Site name
string siteName = System.Web.Hosting.HostingEnvironment.SiteName;
//string siteName = "ABC"; // This does not return any results, but this is what I need info on
Dictionary<string, string> ret = new Dictionary<string, string>();
// Get the sites section from the AppPool.config
Microsoft.Web.Administration.ConfigurationSection sitesSection =
Microsoft.Web.Administration.WebConfigurationManager.GetSection(null, null, "system.applicationHost/sites");
foreach (Microsoft.Web.Administration.ConfigurationElement site in sitesSection.GetCollection())
{
// Find the right Site
if (String.Equals((string)site["name"], siteName, StringComparison.OrdinalIgnoreCase))
{
// For each binding see if they are http based and return the port and protocol
foreach (Microsoft.Web.Administration.ConfigurationElement binding in site.GetCollection("bindings"))
{
string protocol = (string)binding["protocol"];
string bindingInfo = (string)binding["bindingInformation"];
if (protocol.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{
string[] parts = bindingInfo.Split(':');
if (parts.Length == 3)
{
string port = parts[1];
ret.Add(protocol, port);
}
}
}
}
}
return ret;
}
applicationHost.config 包含:
<sites>
<site name="Default Web Site" id="1" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
</application>
<application path="/AHSTest" applicationPool="DefaultAppPool">
<virtualDirectory path="/" physicalPath="E:\inetpub\wwwroot\AHSTest" />
</application>
<application path="/BCA" applicationPool="DefaultAppPool">
<virtualDirectory path="/" physicalPath="E:\inetpub\wwwroot\BCA" />
</application>
<!-- This is the web application my code is in -->
<application path="/ABCTools" applicationPool="ABCTools">
<virtualDirectory path="/" physicalPath="E:\inetpub\wwwroot\ABCTools" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
<binding protocol="net.tcp" bindingInformation="808:*" />
<binding protocol="net.msmq" bindingInformation="localhost" />
<binding protocol="msmq.formatname" bindingInformation="localhost" />
<binding protocol="net.pipe" bindingInformation="*" />
</bindings>
</site>
<!-- This is the site I need binding info on: http, port 7070 -->
<site name="ABC" id="2" serverAutoStart="true">
<application path="/" applicationPool="ABC">
<virtualDirectory path="/" physicalPath="E:\inetpub\wwwroot\ABCWS" />
</application>
<application path="/ABCAPI/Services" applicationPool="ABC">
<virtualDirectory path="/" physicalPath="E:\inetpub\wwwroot\ABCWS\ABCAPI\Services" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:7070:" />
</bindings>
</site>
<siteDefaults>
<logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" />
<traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" />
</siteDefaults>
<applicationDefaults applicationPool="DefaultAppPool" />
<virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>
更新 - 修复
public static Dictionary<string, int> GetBindings(string siteName) // "ABC"
{
Dictionary<string, int> ret = new Dictionary<string, int>();
var lServerManager = new ServerManager();
SiteCollection scSites = lServerManager.Sites;
var abcSite = scSites[siteName];
if (null != abcSite)
{
foreach (var binding in abcSite.Bindings)
{
int port = binding.EndPoint.Port;
ret.Add(binding.Protocol, port);
}
}
return ret;
}
【问题讨论】:
-
有些事情你很容易错过,blog.lextudio.com/…
-
@LexLi 对不起,没有帮助。我看不到问题。
-
那么还有一些技巧。 1)您没有透露您的项目文件,因此无法判断您是否使用错误的方式使用
Microsoft.Web.AdministrationAPI 2)“信息来自位于 C:\Windows\System32\ 中的“applicationHost.config” inetsrv\config" 不正确。如果您使用错误的程序集引用,那么您的代码会查询其他内容。 3) 围绕绑定的整个 API 可以是强类型的,因此基于ConfigurationElement的代码 sn-p 不是探索元素的最佳方式。 -
我在编辑后的帖子中添加了修复
-
你找到答案了吗?如果是这样,您应该发布自己的答案并接受它。