¿Cómo obtener el nombre de host completo + número de puerto en Application_Start of 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 publicó en IIS7, hay una excepción que dice

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

Alguien sabe cómo lograr esto?

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 está disponible el contexto de solicitud.

Editar: Aquí hay una muestra de código inspirada en el blog de Mike Volodarsky al que Michael Shimmins vincula:

  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; } } 

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 la sesión es válida). Application_BeginRequest activará en cada solicitud.

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

Simplemente respondiendo esto, si alguien alguna vez decide buscar realmente en este tema …

Esto funciona en el inicio de la aplicación en cualquier modo …

 typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)