在运行时获取IIS绑定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在运行时获取IIS绑定相关的知识,希望对你有一定的参考价值。

我想知道如何使用ASP.NET在运行时获取当前站点(主机名,端口,IP地址)的IIS绑定设置。 .NET是否提供了获取这些信息的方法?

编辑:我需要一种方法来将http和https端口配置为在从http切换到https时重定向到正确的端口,如果使用其他端口80/443则从https返回到http。没有扩展权限,有没有办法做到这一点?

问候

答案

实现这一目标的唯一方法(不是管理员)是使用Microsoft.Web.Administration。我刚刚写了一篇关于如何做到这一点的快速博客,请参阅: http://blogs.msdn.com/b/carlosag/archive/2011/01/21/get-iis-bindings-at-runtime-without-being-an-administrator.aspx

基本上,由于IIS具有我们称为工作进程隔离的功能,因此可以从应用程序本身读取配置,而无需成为管理员。如果您使用ADSI,Metabase或任何其他方式,您将需要成为管理员。

另一答案

您应该能够通过使用System.DirectoryServices程序集访问IIS元数据库来完成此操作。

例如,您可以在此处枚举这些站点中包含的所有站点和属性配置。

将此引用添加到项目中:

using System.DirectoryServices

// Assuming your Server Id is 1, and you are connecting to your local IIS.
DirectoryEntry de = new DirectoryEntry(@"IIS://localhost/W3SVC/1/Root");
foreach (DirectoryEntry entry in de.Children)
{
   foreach (PropertyValueCollection property in entry.Properties)
   {
      Console.WriteLine("Name: {0}, Value {1}",property.PropertyName, property.Value);
   }
}
另一答案

我想你正在寻找元数据库访问:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/43a51d34-7c81-413b-9727-ec9a19d0b428.mspx?mfr=true

另一答案

您可以使用以下代码来获取绑定:

public static IEnumerable<Binding> GetSiteBindings(Site site)
{
    BindingCollection bindings = site.Bindings;
    if (bindings != null)
    {
        foreach (Binding binding in bindings)
        {
            if (binding != null)
            {
                yield return binding;
            }
        }
    }

    yield return null;
}

以下代码可用于测试上述方法:

ServerManager mgr = new ServerManager();
foreach (Site s in mgr.Sites)
{
    Response.Write("Site: " + s);
    Response.Write("<br/>");

    var siteBindings = GetSiteBindings(s);
    if (siteBindings != null)
    {
        foreach (var binding in siteBindings)
        {
            if (binding != null)
            {
                var bindingInformation = binding.BindingInformation;
                var host = binding.Host;
                var endPoint = binding.EndPoint;

                Response.Write("Host: " + host + ", BindingInfo: " + bindingInformation + ", EndPoint: " + endPoint);
                Response.Write("<br/>");
            }
        }
    }

    Response.Write("----------------------------------");
    Response.Write("<br/>");
}

使用的命名空间:

<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="Microsoft.Web.Administration" %>

大会参考:Microsoft.Web.Administration

enter image description here

将上面的代码放在Sample.aspx中进行测试:

<%@ Page Language="C#" %>

<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="Microsoft.Web.Administration" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        ServerManager mgr = new ServerManager();
        foreach (Site s in mgr.Sites)
        {
            Response.Write("Site: " + s);
            Response.Write("<br/>");

            var siteBindings = GetSiteBindings(s);
            if (siteBindings != null)
            {
                foreach (var binding in siteBindings)
                {
                    if (binding != null)
                    {
                        var bindingInformation = binding.BindingInformation;
                        var host = binding.Host;
                        var endPoint = binding.EndPoint;

                        Response.Write("Host: " + host + ", BindingInfo: " + bindingInformation + ", EndPoint: " + endPoint);
                        Response.Write("<br/>");
                    }
                }
            }

            Response.Write("----------------------------------");
            Response.Write("<br/>");
        }
    }

    public static IEnumerable<Binding> GetSiteBindings(Site site)
    {
        BindingCollection bindings = site.Bindings;
        if (bindings != null)
        {
            foreach (Binding binding in bindings)
            {
                if (binding != null)
                {
                    yield return binding;
                }
            }
        }

        yield return null;
    }



</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="HtmlForm" runat="server">
        <div>
        </div>
    </form>
</body>
</html>

会给你这样的输出:

enter image description here

以上是关于在运行时获取IIS绑定的主要内容,如果未能解决你的问题,请参考以下文章

用户运行托管 IIS 链接时如何在 asp.net 中获取客户端 IP 地址

在IIS上运行C#WCF服务时获取重复记录

如何通过 C# 从 IIS 获取网站名称的端口?

我可以在IIS中更改证书指纹:使用PowerShell进行SSLBindings吗?

iis绑定ssl证书 只提供了crt文件无Key文件怎么办?

用代码在 IIS 中创建 wcf 服务