Programmatically retrieve the site URL from inside an Azure website

不问归期 提交于 2019-11-30 21:39:13

Edit (2/4/16): You can get the URL from the appSetting/EnvironmentVariable websiteUrl. This will also give you the custom hostname if you have one setup.

There are few of ways you can do that.

1. From the HOSTNAME header

This is valid only if the request is hitting the site using <SiteName>.azurewebsites.net. Then you can just look at the HOSTNAME header for the <SiteName>.azurewebsites.net

var hostName = Request.Headers["HOSTNAME"].ToString()

2. From the WEBSITE_SITE_NAME Environment Variable

This just gives you the <SiteName> part so you will have to append the .azurewebsites.net part

var hostName = string.Format("http://{0}.azurewebsites.net", Environment.ExpandEnvironmentVariables("%WEBSITE_SITE_NAME%"));

3. From bindingInformation in applicationHost.config using MWA

you can use the code here to read the IIS config file applicationHost.config and then read the bindingInformation property on your site. Your function might look a bit different, something like this

private static string GetBindings()
{
    // Get the Site name 
    string siteName = System.Web.Hosting.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"];
                if (bindingInfo.IndexOf(".azurewebsites.net", StringComparison.InvariantCultureIgnoreCase) > -1)
                {
                    return bindingInfo.Split(':')[2];
                }
            }
        }
    }
    return null;
}

Personally, I would use number 2

Also, you can use Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME").

This will return full URL ("http://{your-site-name}.azurewebsites.net"), no string manipulations required.

To see a full list of properties available in environment variables just type Get-ChildItem Env: in SCM PowerShell debug console.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!