获取ASP.NET网站的IIS站点名称

58
在我的ASP.NET Web应用程序中,我想查找创建时在IIS中分配给它的名称,该名称对服务器唯一。我不关心Web站点的域名,而是关心在IIS中分配给站点的实际名称。
我需要能够可靠地在IIS6和7上执行此操作。
需要明确的是,我指的是在IIS中分配的名称,而不是域名,也不是虚拟目录路径。

你能详细阐述一下动机吗? - Chuck Conway
1
我正在为我编写的Web应用程序进行许可证授权,我需要确保许可证密钥在同一服务器上每个Web应用程序中仅使用一次。该Web应用程序与分配给IIS站点的多个域名一起工作,因此将密钥绑定到站点的域名不起作用。同样,将密钥绑定到机器名称也不起作用,因为我的应用程序可能会安装在同一台机器上的多个客户端上。简而言之,我需要某些唯一标识特定机器上的IIS网站的东西。由于IIS不允许具有相同名称的多个站点,因此我认为这是正确的方法。 - Søren Spelling Lund
我并不是想表现得傲慢,我只是好奇为什么有人想这样做。 - Chuck Conway
我对IIS7不太确定,但在IIS6中,每个站点都被赋予一个唯一的siteId。如果在IIS7中不是这种情况,我会感到惊讶。 - Chuck Conway
这是正确的,也是我的备选策略。唯一的问题是,如果您删除该站点,则会获得新的ID,这将使密钥无用。这就是为什么我想将其绑定到站点名称而不是ID。您更有可能重复使用它。 - Søren Spelling Lund
1
这不是与https://dev59.com/I0fRa4cB1Zd3GeqP-I8_重复了吗? - Moayad Mardini
6个回答

68

更新

如Carlos和其他人在评论中提到的,最好使用HostingEnvironment.SiteName,因为根据文档,GetSiteName不应该被用户使用。

旧解决方案

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

1
我在几分钟前测试了IIS 7/5.1,我认为它适用于IIS 6(90%)。 - m3kh
17
有没有直接获取 HostingEnvironment.SiteName 的方法?此外,你也可以读取 ServerVariable "InstanceName" 来获得这个信息。 - Carlos Aguilar Mares
8
对于我来说,这总是返回“默认网站”,而“System.Web.Hosting.HostingEnvironment”的在线文档说明:“此属性支持ASP.NET基础结构,不应直接从您的代码中使用”。 - belugabob
1
@belugabob,您使用的是哪个版本的IIS?您确定您正在使用另一个WebSite,而不是“Default Web Site”下的VirtualDirectory吗?顺便说一句,不要听文档人的话。看看CarlosAg的评论,他是IIS团队的成员。 - m3kh
6
根据文档的说明,应该不要从代码中调用Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()。而应该使用Web.Hosting.HostingEnvironment.SiteName。因此被投下了反对票。 - Dan Atkinson
显示剩余5条评论

20

正如@belugabob和@CarlosAg已经提到的那样,我宁愿使用System.Web.Hosting.HostingEnvironment.SiteName而不是System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(),因为IApplicationHost.GetSiteName方法不应该直接调用!(msdn)

因此,最好使用HostingEnvironment.SiteName属性! (msdn)

我认为这应该是正确的答案,符合文档要求 ;)


2
感谢您指出这一点。在我的情况下,System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() 起了作用,但后来我遇到了一个奇怪的序列化错误 "Type is not resolved for member",我无法追踪。切换到 HostingEnvironment.SiteName 后问题就消失了。我认为这可能与 MarshalByRefObject 与 Serialization 不兼容有关。以防万一其他人也遇到了这个问题,切换到 HostingEnvironment.SiteName 可以解决这个问题。 - Marc Loeb

12

这里有一个相关的帖子,可以获取网站的Id。

以下是可能适用于您的代码:

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,但如果您安装了IIS7的IIS6兼容性组件,则应该可以工作。


9
你正在寻找提供对IIS 7.0配置系统读写访问权限的ServerManagerMicrosoft.Web.Administration)。

通过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。如果使用WMI,请查看WMI Code Creator 1.0(免费/由Microsoft开发)。它将为您生成代码。
希望对您有所帮助。

0

连接远程服务器时,首先需要执行ServerManager.OpenRemote("serverName")。

基本上就是像这样做

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

            }

查看 MSDN 帮助


0
您可以使用以下代码。
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;
}

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