How to get full host name + port number in Application_Start of Global.aspx?

72,949

Solution 1

When your web application starts, there is no HTTP request being handled.

You may want to handle define the Application_BeginRequest(Object Sender, EventArgs e) method in which the the Request context is available.

Edit: Here is a code sample inspired by the Mike Volodarsky's blog that Michael Shimmins linked to:

    void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        var host = FirstRequestInitialisation.Initialise(app.Context);
    }

    static class FirstRequestInitialisation
    {
        private static string host = null;
        private static Object s_lock = new Object();

        // Initialise only on the first request
        public static string Initialise(HttpContext context)
        {
            if (string.IsNullOrEmpty(host))
            {
                lock (s_lock)
                {
                    if (string.IsNullOrEmpty(host))
                    {
                        var uri = context.Request.Url;
                        host = uri.GetLeftPart(UriPartial.Authority);
                    }
                }
            }

            return host;
        }
    }

Solution 2

The accepted answer is good, but in most cases (if the first request is a HTTP Request) you should better use the Session_Start event, which is called once per user every 20 minutes or so (not sure how long the session is valid). Application_BeginRequest will be fired at every Request.

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}

Solution 3

Just answering this so if someone ever decides to actually search on this topic...

This works on application start in any mode...

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)
Share:
72,949
Leo
Author by

Leo

Updated on November 24, 2020

Comments

  • Leo
    Leo over 3 years

    I tried

    Uri uri = HttpContext.Current.Request.Url;
    String host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;
    

    and it worked well on my local machine, but when being published to IIS7, there is an exception saying

    System.Web.HttpException: Request is not available in this context
    

    Anyone know how to achieve this?

  • Chris Marisic
    Chris Marisic almost 12 years
    Shouldn't that be Uri uri = context.Request.Url; also couldn't the next line be simplified to merely uri.GetLeftPart(UriPartial.Authority);
  • Steve
    Steve over 10 years
    this should also be a static class and you don't need to initialize host.
  • PaulK
    PaulK over 9 years
    So there really is no way to get the port number until the very first HTTP request arrives?
  • Stephen Reindl
    Stephen Reindl about 9 years
    please note that field is non-public (i.e. private). You should be very careful to use non-documented features and fields as they can change without further information.
  • revlayle
    revlayle about 9 years
    Actually no. An ASP.NET website can have multiple bindings, it could run under multiple hosts and multiple port numbers (for example a secure and non-secure version of the website). You only have one instance of the web application running, the incoming request has information on what host initiated the request. The web application just knows it is an application, it has no real context of what host it is running under. If you app has two bindings, one for port 80 and one for port 8080, which one do you want? You don't know, that is why you want it on a per-request basis.
  • Dan Atkinson
    Dan Atkinson about 7 years
    It's a pretty elegant solution. I found the need to get the 'base' domain in the app start and use it when JIT'ing the application. I ended up moving my logic into Begin_Request. The Application_Start is now empty and the Begin_Request contains the logic and a simple check on whether the domain is not null or empty.
  • trnelson
    trnelson about 7 years
    I'm curious, why two checks on the value of host? My guess is a concurrency issue in case the value is set in that small gap of time, but just double checking to see if this was a mistake.
  • Andrii
    Andrii over 6 years
    And how is it different from HttpContext.Current.Request??? I see the same result