【问题标题】:Get hostname in ASP.Net on IIS在 IIS 上的 ASP.Net 中获取主机名
【发布时间】:2017-12-30 23:55:41
【问题描述】:

基于我的问题here

我将在Application_Start 中获取主机名,所以我之前已经完成了类似的操作:

if(string.IsNullOrWhiteSpace(Hostname)) 
        Hostname = Dns.GetHostName();

根据这个截图:

但它返回skyweb - 但我想得到RND1

获取主机名的另一种解决方案是HttpContext.Current.Request.Url.Host;,但正如您所知,我不想通过页面事件进入,最好在第一次启动时启动...

那么最好的方法是什么?

提前致谢。

编辑1:

如果你看一下here,你会看到我在寻找图片中指向的那个,同时我在这个截图中再次提到:

我无法在配置中设置,可以在安装过程中设置,也可以由服务器管理员手动设置。

我在添加新网站时正在寻找主机名。

【问题讨论】:

  • 为什么不在您的配置(例如 appsettings)中自己指定一个设置?尝试根据 DNS 查找或检查绑定来自动确定它会比它的价值更麻烦。
  • RND1 和 RND2 不是主机名。它们是站点名称。 DNS 和/或 URL 主机名也不一定与机器名相同。所有这些都是不同的东西,所以不清楚你真正要求的是什么。
  • 请参阅更新部分。
  • RND1 和 RND2 是站点名,但我也将主机名设置为相同,无论如何应该有一种方法可以从绑定或其他方式获取主机名...

标签: c# asp.net iis


【解决方案1】:

除非您的应用程序可以访问 IIS 配置数据(它们通常不会),否则您所指的框中的主机名只能作为 URL 的一部分访问期间要求。原因之一是一个站点可以有任意数量的绑定,它们甚至可以有通配符。我之前曾尝试从应用程序本身访问站点绑定配置,但似乎应用程序无权读取自己的配置。我不确定微软为什么选择做出这种限制,这可能是有充分理由的,但我不知道它是什么。

【讨论】:

  • 是的,一个站点可能有任意数量的绑定,但是如果我可以从 Http 绑定中获取主机名,那么问题就会为我解决,但在 app_start
  • 正如我所说,应用程序本身无法访问此信息(至少几年前我试图在 IIS 7 上获取它时)。
  • 我最终编写了一个安装脚本,在安装过程中从 IIS 中查询信息(然后您可以访问)并将其放入 web.config 中的设置中,几年后我放弃了它而支持一种不同的方法,它根据用于访问应用程序的 URL 计算每个请求的值。
  • 感谢您对我 +1 的帮助和努力。
【解决方案2】:

我解决了它并得到了我想要的东西,在这里发布给其他人可能需要这个解决方案。

当我们添加主机名并绑定applicationHost.config 文件时,该文件位于C:\Windows\System32\inetsrv\config,因此每个站点都会发生一些变化,例如bindingapppool 等,对我来说,我看到了RND1 的绑定是这样的:

<site name="RND1" id="3">
  <bindings>
    <binding protocol="http" bindingInformation="*:80:RND1" />
    <binding protocol="net.pipe" bindingInformation="RND1" />
    <binding protocol="net.tcp" bindingInformation="2042:RND1" />
    <binding protocol="https" bindingInformation="*:443:RND1" sslFlags="0" />
    <binding protocol="net.msmq" bindingInformation="RND1" />
   </bindings>
</site>

所以我们可以获取 applicationhost 文件并对其进行操作,但通过一些搜索我找到了 this,它提供了一些有用的信息,可以在运行时获取 IIS 绑定。

我实现了如下代码的少许更改来获取主机名:

 private static string GetHostname()
    {
        // Get the Site name 
        string siteName = HostingEnvironment.SiteName; 
        // Get the sites section from the AppPool.config
        Microsoft.Web.Administration.ConfigurationSection sitesSection =
            Microsoft.Web.Administration.WebConfigurationManager.GetSection(null, null,
                "system.applicationHost/sites");
        foreach (Microsoft.Web.Administration.ConfigurationElement site in sitesSection.GetCollection())
        {
            // Find the right Site
            if (string.Equals((string)site["name"], siteName, StringComparison.OrdinalIgnoreCase))
            { 
                // For each binding see if they are http based and return the port and protocol
                foreach (Microsoft.Web.Administration.ConfigurationElement binding in site.GetCollection("bindings"))
                {
                    var bindingInfo = (string)binding["bindingInformation"]; 
                    return bindingInfo.Split(':')[2]; 
                }
            }
        }
        return null;
    }

并在application_start 中使用它,例如:

void Application_Start(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(Hostname))
            Hostname = GetHostname();
    }

希望它对其他人有用。

谢谢。

【讨论】:

  • 这可能会在调试器下工作,但是在 IIS 下运行时,这是否可以从应用程序内部工作?我不认为默认的 IIS 应用程序身份可以访问这些对象。
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2012-01-05
相关资源
最近更新 更多