Ответ 1
System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();
В моем веб-приложении ASP.NET я хотел бы найти имя, которое оно было задано, когда оно было создано в IIS, которое уникально для сервера. Я бы не интересовался доменным именем для веб-сайта, а фактическим именем, указанным на сайте в IIS.
Мне нужно иметь возможность сделать это надежно для IIS6 и 7.
Чтобы быть ясным, я говорю об имени в IIS, а не о доменном имени, а не о пути виртуального каталога.
System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();
Ниже приведено сообщение в поиске идентификатора сайта.
Вот код, который может сработать для вас:
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, он должен работать.
Вы ищете 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). Он будет генерировать код для вас.
НТН
Как уже упоминалось @belugabob и @CarlosAg, я предпочитаю использовать System.Web.Hosting.HostingEnvironment.SiteName
вместо System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()
, потому что метод IApplicationHost.GetSiteName не предназначен для прямого вызова! (msdn)
Итак, вам лучше использовать свойство HostingEnvironment.SiteName! (msdn)
Я думаю, что это должен быть правильный ответ в отношении документации;)
Сначала необходимо подключиться к удаленному серверу ServerManager.OpenRemote( "имя_сервера" ).
В основном что-то подобное
using (ServerManager srvMgr = ServerManager.OpenRemote("serverName"))
{
}
Вы можете использовать ниже код
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;
}