[英]Retrieving binding information from IIS
在我的 IIS 設置中有兩個站點: 默認 Web 站點,在該站點下有許多 web 應用程序; 和另一個網站“ABC”。
我正在嘗試從默認 Web 站點中的 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>
我無法理解您的問題,但Microsoft 文檔上的此示例代碼顯示了如何獲取和顯示每個站點的綁定。
_serviceProxy = (TestDemoModuleServiceProxy)
Connection.CreateProxy(Module, typeof(TestDemoModuleServiceProxy));
// Get the site collection on this server.
SiteCollection siteCollection = _serviceProxy.GetSiteCollection();
string collectiondisplay = null;
collectiondisplay = "There are " + siteCollection.Count.ToString() + " sites:\n\n";
string sitedisplay = null;
foreach (Site site in siteCollection)
{
sitedisplay = sitedisplay + site.Name + ": ID= " + site.Id + "\n";
// Display each property of each bindings.
string bindingdisplay = null;
foreach (Microsoft.Web.Administration.Binding binding in site.Bindings)
{
bindingdisplay = bindingdisplay + " Binding:\n BindingInformation: " +
binding.BindingInformation;
if (binding.Protocol == "https")
{
// There is a CertificateHash and
// CertificateStoreName for the https protocol only.
bindingdisplay = bindingdisplay + "\n CertificateHash: " +
binding.CertificateHash + ": ";
// Display the hash.
foreach (System.Byte certhashbyte in binding.CertificateHash)
{
bindingdisplay = bindingdisplay + certhashbyte.ToString() + " ";
}
bindingdisplay = bindingdisplay + "\n CertificateStoreName: " +
binding.CertificateStoreName;
}
bindingdisplay = bindingdisplay + "\n EndPoint: " + binding.EndPoint;
bindingdisplay = bindingdisplay + "\n Host: " + binding.Host;
bindingdisplay = bindingdisplay + "\n IsIPPortHostBinding: " + binding.IsIPPortHostBinding;
bindingdisplay = bindingdisplay + "\n Protocol: " + binding.Protocol;
bindingdisplay = bindingdisplay + "\n ToString: " + binding.ToString();
bindingdisplay = bindingdisplay + "\n UseDsMapper: " + binding.UseDsMapper + "\n\n";
}
sitedisplay = sitedisplay + bindingdisplay;
}
collectiondisplay = collectiondisplay + sitedisplay + "\n";
testLabel.Text = collectiondisplay;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.