【问题标题】:Get IIS site name from for an ASP.NET website从 ASP.NET 网站获取 IIS 站点名称
【发布时间】:2010-12-11 21:44:33
【问题描述】:

在我的 ASP.NET Web 应用程序中,我想查找它在 IIS 中创建时给出的名称,这是服务器独有的。我对网站的域名不感兴趣,而是在 IIS 中为网站提供的实际名称。

我需要能够可靠地为 IIS6 和 7 做到这一点。

要清楚,我说的是 IIS 中的给定名称,而不是域名,也不是虚拟目录路径。

【问题讨论】:

  • 你能详细说明一下动机吗?
  • 我正在为我编写的 Web 应用程序进行许可,我需要确保每个 Web 应用程序即使在同一台服务器上也只使用一次许可证密钥。 Web 应用程序使用分配给 IIS 站点的多个域名,因此无法将密钥绑定到站点的域名。同样徒劳地将密钥绑定到机器名称也不会这样做,因为我的应用程序可能会为同一台机器上的多个客户端安装。简而言之,我需要在特定机器上唯一标识 IIS 网站的东西。由于 IIS 不允许使用相同名称的多个站点,我认为这是可行的方法。
  • 我不是故意要显得居高临下,我只是好奇为什么有人要这样做。
  • 我不确定 IIS7,但在 IIS6 中,每个站点都有一个唯一的 siteId。如果在 IIS7 中不是这种情况,我会感到惊讶

标签: c# asp.net iis


【解决方案1】:

你可以使用下面的代码

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;
}

【讨论】:

    【解决方案2】:

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

    所以你最好使用 HostingEnvironment.SiteName 属性! (msdn)

    我认为这应该是关于文档的正确答案;)

    【讨论】:

    • 感谢您指出这一点。在我的情况下 System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() 工作,但后来我遇到了一个奇怪的“类型未为成员解析”的序列化,我无法追踪。切换到 HostingEnvironment.SiteName 后它就消失了。我认为它与 MarshalByRefObject 与序列化不兼容有关。以防万一有人也受到此打击,切换到 HostingEnvironment.SiteName 解决了该问题。
    【解决方案3】:

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

    基本上做这样的事情

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

    see msdn help

    【讨论】:

      【解决方案4】:

      您正在寻找 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 来执行此操作,但我建议您使用比 ADSI 更快的 WMI。如果使用 WMI,请查看 WMI Code Creator 1.0(免费/由 Microsoft 开发)。它将为您生成代码。

      HTH

      【讨论】:

        【解决方案5】:
        System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();
        

        【讨论】:

        • 我在 IIS 7/5.1 上测试了几分钟,我认为它适用于 IIS 6 (90%)。
        • 不就是直接有一个HostingEnvironment.SiteName吗?此外,您还可以阅读 ServerVariable "InstanceName",它也会为您提供。
        • 这总是为我返回“默认网站” - 以及“System.Web.Hosting.HostingEnvironment”的在线文档状态“此属性支持 ASP.NET 基础结构,不打算使用直接从您的代码中'
        • @belugabob,IIS 的哪个版本?您确定您使用的是另一个网站,而不是“默认网站”下的虚拟目录吗?顺便说一句,不要听文件的人。查看 CarlosAg 的评论,他是 IIS 团队的成员。
        • 投反对票,因为根据docs,Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() 不应从您的代码中调用。应该改用Web.Hosting.HostingEnvironment.SiteName。
        【解决方案6】:

        这是一个related post 用于检索站点 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");
          }
        

        }

        这是original post的链接。

        我不确定它是否可以在 IIS7 上运行,但如果您为 IIS7 安装 IIS6 兼容组件,它应该可以运行。

        【讨论】:

          猜你喜欢
          • 2014-07-30
          • 1970-01-01
          • 1970-01-01
          • 2018-06-26
          • 2012-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-19
          相关资源
          最近更新 更多