Подтвердить что ты не робот

Получить имя сайта IIS для веб-сайта ASP.NET

В моем веб-приложении ASP.NET я хотел бы найти имя, которое оно было задано, когда оно было создано в IIS, которое уникально для сервера. Я бы не интересовался доменным именем для веб-сайта, а фактическим именем, указанным на сайте в IIS.

Мне нужно иметь возможность сделать это надежно для IIS6 и 7.

Чтобы быть ясным, я говорю об имени в IIS, а не о доменном имени, а не о пути виртуального каталога.

Значение из IIS, которое я хотел бы прочитать из С# http://img252.imageshack.us/img252/6621/capturedz.png

4b9b3361

Ответ 1

System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();

Ответ 2

Ниже приведено сообщение в поиске идентификатора сайта.

Вот код, который может сработать для вас:

using System.DirectoryServices;
using System;

public class IISAdmin
{
   public static void GetWebsiteID(string websiteName)
   {
      DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc");

     foreach(DirectoryEntry de in w3svc.Children)
     {
        if(de.SchemaClassName == "IIsWebServer" && de.Properties["ServerComment"][0].ToString() == websiteName)
        {
           Console.Write(de.Name);
        }

     }

  }
  public static void Main()
  {
     GetWebsiteID("Default Web Site");
  }

}

Здесь ссылка на оригинальный пост.

Я не уверен, что он будет работать на IIS7, но если вы установите компоненты совместимости IIS6 для IIS7, он должен работать.

Ответ 3

Вы ищете ServerManager (Microsoft.Web.Administration), который обеспечивает доступ на чтение и запись конфигурации IIS 7.0.

Итерации через Microsoft.Web.Administration.SiteCollection, получите ссылку на свой сайт с использованием объекта сайта и прочитайте значение свойства Name.

// Snippet        
using (ServerManager serverManager = new ServerManager()) { 

var sites = serverManager.Sites; 
foreach (Site site in sites) { 
         Console.WriteLine(site.Name); // This will return the WebSite name
}

Вы также можете использовать LINQ для запроса коллекции ServerManager.Sites(см. пример ниже)

// Start all stopped WebSites using the power of Linq :)
var sites = (from site in serverManager.Sites 
            where site.State == ObjectState.Stopped 
            orderby site.Name 
            select site); 

        foreach (Site site in sites) { 
            site.Start(); 
        } 

Примечание. Microsoft.Web.Administration работает только с IIS7.

Для IIS6 вы можете использовать как ADSI, так и WMI, но я предлагаю вам перейти на WMI, который быстрее ADSI. Если вы используете WMI, посмотрите WMI Code Creator 1.0 (бесплатно/разработано Microsoft). Он будет генерировать код для вас.

НТН

Ответ 4

Как уже упоминалось @belugabob и @CarlosAg, я предпочитаю использовать System.Web.Hosting.HostingEnvironment.SiteName вместо System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(), потому что метод IApplicationHost.GetSiteName не предназначен для прямого вызова! (msdn)

Итак, вам лучше использовать свойство HostingEnvironment.SiteName! (msdn)

Я думаю, что это должен быть правильный ответ в отношении документации;)

Ответ 5

Сначала необходимо подключиться к удаленному серверу ServerManager.OpenRemote( "имя_сервера" ).

В основном что-то подобное

            using (ServerManager srvMgr = ServerManager.OpenRemote("serverName"))
            {

            }

см. справку msdn

Ответ 6

Вы можете использовать ниже код

private string WebsiteName()
{
    string websiteName = string.Empty;
    string AppPath = string.Empty;
    AppPath = Context.Request.ServerVariables["INSTANCE_META_PATH"];
    AppPath = AppPath.Replace("/LM/", "IIS://localhost/");
    DirectoryEntry root = new DirectoryEntry(AppPath);
    websiteName = (string)root.Properties["ServerComment"].Value;
    return websiteName;
}