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