Вземете IIS свързвания по време на изпълнение

Чудя се как да получа настройките за свързване на IIS на текущия сайт (име на хост, порт, IP адрес) по време на изпълнение с помощта на ASP.NET. Предоставя ли .NET някакъв начин за получаване на тази информация?

Редактиране: Трябва ми начин да конфигурирам http и https портовете да пренасочват към правилния порт при превключване от http към https и обратно от https към http, ако се използват други портове след 80/443. Има ли начин да направите това без разширени привилегии?

за разбирането


person Jay    schedule 21.01.2011    source източник
comment
Каква версия на IIS използвате?   -  person RQDQ    schedule 21.01.2011
comment
Е, това трябва да работи на IIS 6, 7 и 7.5   -  person Jay    schedule 22.01.2011


Отговори (4)


Единственият начин да постигнете това (без да сте администратор) е да използвате 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 или друг начин, ще трябва да сте администратор.

person Carlos Aguilar Mares    schedule 22.01.2011
comment
Благодаря за това. Само бърза бележка, че необходимият Microsoft.Web.Administration.dll е в C:\Windows\System32\inetsrv на сървъра. Също така аргументът HttpContext не е необходим, така че това може да се зареди при стартиране на приложението. - person Derrick; 05.04.2012
comment
@carlosag Използвах Microsoft.Web.Administration за четене на конфигурация без администраторски привилегии; изисквате ли администраторски права за запис в конфигурацията? Не мога да намеря никаква документация за това. - person Paul d'Aoust; 22.12.2014
comment
Хей, Карлос, изглежда, че MSDN е загубил публикацията ви в блога, има ли шанс да възпроизведете решението си тук? - person Oblivious Sage; 05.11.2020
comment
За щастие изглежда, че IIS.net все още го има: blogs.iis.net/carlosag/ - person Carlos Aguilar Mares; 27.03.2021

Трябва да можете да постигнете това чрез достъп до метабазата на 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);
   }
}
person George Johnston    schedule 21.01.2011

Мисля, че търсите достъп до метабаза:

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

person RQDQ    schedule 21.01.2011

Можете да използвате следния код, за да получите обвързванията:

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

въведете описание на изображението тук

Поставяне на горния код в 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>

Ще ви даде резултат като този:

въведете описание на изображението тук

person Raghav    schedule 04.09.2018