2010-11-22 9 views
47

me trataron¿Cómo obtener el nombre de host completo + número de puerto en Application_Start of Global.aspx?

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 de publicarse en IIS7, hay una excepción diciendo

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

Alguien sabe cómo lograr esto?

+0

de verificación del puerto – TalentTuner

+0

Consulte también http://stackoverflow.com/a/578083/12484 para obtener una forma más clara de obtener el esquema + host + puerto de una URL (una vez que tenga una). –

+0

Parece que está ejecutando en modo integrado, no clásico (que creo que está ejecutando en su local). El problema es que Request no está disponible en Application_Start en IIS7. Eche un vistazo a: http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx Which explain muy bien –

Respuesta

59

Cuando se inicia la 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í es un ejemplo de código inspirado en el blog de la Mike Volodarski que Michael Shimmins vinculada a:

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

¿Por qué votar abajo esto? Esta es una sugerencia correcta. –

+3

No debería ser 'Uri uri = context.Request.Url;' tampoco podría simplificarse la siguiente línea simplemente a 'uri.GetLeftPart (UriPartial.Authority);' –

+0

esto también debería ser una clase estática y usted no No es necesario inicializar el host. – Steve

7

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

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

Sólo responder a esta por lo que si alguna vez alguien decide buscar realmente en este tema ...

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

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

tenga en cuenta que el campo no es público (es decir, privado). Debe tener mucho cuidado al usar características y campos no documentados, ya que pueden cambiar sin más información. –

+0

¿Y cómo es diferente de 'HttpContext.Current.Request' ??? Veo el mismo resultado – Andrii

Cuestiones relacionadas