在运行时获取IIS绑定

18

我想知道如何在运行时使用ASP.NET获取当前网站的IIS绑定设置(主机名、端口、IP地址)。

.NET是否提供获取这些信息的任何方法?

编辑:我需要一种方法来获取配置为http和https端口,以便在从http切换到https时重定向到正确的端口,并在从https切换回http时重定向到正确的端口,如果使用的不是80/443端口。 是否有一种无需扩展特权就可以实现此操作的方法?

敬礼


你正在运行哪个版本的IIS? - RQDQ
这个必须在 IIS 6、7 和 7.5 上运行。 - Jay
4个回答

14
唯一的方法(无需成为管理员)是使用Microsoft.Web.Administration。我刚写了一篇关于如何做到这一点的快速博客,可以参考:
https://web.archive.org/web/20150722034236/http://blogs.msdn.com/b/carlosag/archive/2011/01/21/get-iis-bindings-at-runtime-without-being-an-administrator.aspx

基本上,由于IIS具有我们称之为Worker Process隔离的功能,因此可以在应用程序本身中读取配置,而无需成为管理员。如果使用ADSI、Metabase或其他方式,将需要成为管理员。

2
感谢提供这个信息。快速提醒一下,所需的 Microsoft.Web.Administration.dll 文件位于服务器上的 C:\Windows\System32\inetsrv 目录下。此外,HttpContext 参数不是必需的,因此可以在应用程序启动时加载。 - Derrick
@carlosag 我已经使用 Microsoft.Web.Administration 在没有管理员权限的情况下读取配置文件;您是否需要管理员权限来 写入 配置文件?我找不到任何关于此的文档。 - Paul d'Aoust
嗨,Carlos,看起来MSDN丢失了你的博客文章,你能否在这里重新制作你的解决方案? - Oblivious Sage
幸运的是,看起来IIS.net仍然有它:https://blogs.iis.net/carlosag/get-iis-bindings-at-runtime-without-being-an-administrator - Carlos Aguilar Mares

3

您可以通过访问IIS元数据库,使用System.DirectoryServices程序集来完成此操作。

例如,您可以枚举所有站点及其包含的属性配置。

将以下引用添加到您的项目中:

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);
   }
}

2
您可以使用以下代码获取绑定:
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



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接