【问题标题】:Retrieving binding information from IIS从 IIS 检索绑定信息
【发布时间】: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.Administration API 2)“信息来自位于 C:\Windows\System32\ 中的“applicationHost.config” inetsrv\config" 不正确。如果您使用错误的程序集引用,那么您的代码会查询其他内容。 3) 围绕绑定的整个 API 可以是强类型的,因此基于 ConfigurationElement 的代码 sn-p 不是探索元素的最佳方式。
  • 我在编辑后的帖子中添加了修复
  • 你找到答案了吗?如果是这样,您应该发布自己的答案并接受它。

标签: c# binding iis-8


【解决方案1】:

我无法理解您的问题,但Microsoft docs 上的此示例代码显示了如何获取和显示每个站点的绑定。

更新:

// Get the site collection on this server.
ServerManager serverManager = new ServerManager();
SiteCollection siteCollection = serverManager.Sites;
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;

【讨论】:

  • 我看到了这个;但什么是“连接”和“TestDemoModuleServiceProxy”。似乎示例要么开始一半,要么依赖于未引用的其他示例。
  • 您只需要知道它的作用。当您将此代码应用于您的项目时,它不能完全相同。它所做的实际上是创建一个连接并将所有站点信息存储到 sitecollection。因此,您可以根据需要创建连接。例如,我可以使用它来创建到本地 IIS 的连接并获取有关站点的信息。请查看更新。
  • 更新版本有效;它与我发现并添加到原始帖子中的内容相似,但更详细。我将您的回复标记为答案。
猜你喜欢
  • 2011-01-17
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多