Cómo obtener el nombre de host completo + número de puerto en el Inicio de la aplicación de Global.aspx?


Lo intenté

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

Y funcionó bien en mi máquina local, pero cuando se publica en IIS7, hay una excepción que dice

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

¿Alguien sabe cómo lograr esto?

Author: Leo, 2010-11-22

3 answers

Cuando se inicia su aplicación web, no se está manejando ninguna solicitud HTTP.

Es posible que desee manejar definir el método Application_BeginRequest(Object Sender, EventArgs e) en el que el contexto de la solicitud está disponible.

Edit: Aquí hay un ejemplo de código inspirado en el blog de Mike Volodarsky al que Michael Shimmins enlazó:

    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;
        }
    }
 60
Author: cspolton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-20 20:29:53

La respuesta aceptada es buena, pero en la mayoría de los casos (si la primera solicitud es una solicitud HTTP) debería usar mejor el evento Session_Start, que se llama una vez por usuario cada 20 minutos aproximadamente (no estoy seguro de cuánto tiempo es válida la sesión). Application_BeginRequest se disparará a cada Petición.

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}
 9
Author: VladL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-05 13:43:36

Simplemente respondiendo a esto para que si alguien alguna vez decide realmente buscar en este tema...

Esto funciona al iniciar la aplicación en cualquier modo...

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)
 1
Author: Brandon Seydel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-23 10:23:18