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?
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;
}
}
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 :)
}
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)
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