在IIS上的ASP.Net中获取主机名

时间:2017-12-30 14:44:43

标签: c# asp.net iis

根据我的问题here

我将在Application_Start中获取主机名,所以我在之前做过:

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

基于此屏幕截图:

enter image description here

但它会返回skyweb - 但我希望得到RND1

获取主机名的另一个解决方案是HttpContext.Current.Request.Url.Host;,但是如您所知,我不希望通过页面事件进入,最好先启动...

那么最好的方法是什么?

提前致谢。

EDIT1:

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

enter image description here

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

我正在寻找主机名,同时设置添加新网站。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

当我们添加主机名和绑定时,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();
    }

希望它对其他人有用。

感谢。