2010-11-22 7 views
47

Ho provatoCome ottenere il nome host completo + numero di porta in Application_Start di Global.aspx?

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

e ha funzionato bene sulla mia macchina locale, ma quando in corso di pubblicazione per IIS7, v'è un'eccezione dicendo

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

Qualcuno sa come raggiungere questo obiettivo?

+0

di controllo per la porta – TalentTuner

+0

Vedi anche http://stackoverflow.com/a/578083/12484 per un modo più semplice per ottenere lo schema + host + porta da un URL (una volta che ne hai uno). –

+0

Sembra che tu stia correndo in modalità integrata, non classica (penso che tu stia girando sul tuo locale). Il problema è che la richiesta non è disponibile in Application_Start in IIS7. Date un'occhiata a: http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx che spiega bene. –

risposta

59

All'avvio dell'applicazione Web, non viene gestita alcuna richiesta HTTP.

Si consiglia di gestire il metodo Application_BeginRequest (Object Sender, EventArgs e) in cui è disponibile il contesto della richiesta.

Edit: Ecco un esempio di codice ispirato il blog di Mike Volodarski che Michael Shimmins legato 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

Perché non votare questo? Questo è un suggerimento corretto. –

+3

Non dovrebbe essere "Uri uri = context.Request.Url;" inoltre non è possibile semplificare la riga successiva semplicemente a "uri.GetLeftPart (UriPartial.Authority);" –

+0

anche questa dovrebbe essere una classe statica e non si Non è necessario inizializzare l'host. – Steve

7

La risposta accettata è buona, ma nella maggior parte dei casi (se la prima richiesta è un HTTP Richiesta) si dovrebbe usare meglio l'evento Session_Start, che viene chiamato una volta per utente ogni 20 minuti circa (non è sicuro per quanto tempo la sessione è valida). Application_BeginRequest verrà generato a ogni richiesta.

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

Basta rispondere a questa così se qualcuno decide mai di cercare in realtà su questo argomento ...

Questo funziona all'avvio dell'applicazione in qualsiasi modalità di ...

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

si prega di notare che il campo è non pubblico (cioè privato). Dovresti stare molto attento a utilizzare funzioni e campi non documentati poiché possono cambiare senza ulteriori informazioni. –

+0

E in che modo è diverso da "HttpContext.Current.Request' ??? Vedo lo stesso risultato – Andrii

Problemi correlati