2010-11-22 3 views
47

Ich versuchteWie erhalten Sie den vollständigen Hostnamen + Portnummer in Application_Start von Global.aspx?

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

und es hat gut funktioniert auf meinem lokalen Rechner, aber wenn sie auf IIS7 veröffentlicht wird, gibt es eine Ausnahme

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

Wer weiß, zu sagen, wie dies zu erreichen?

+0

Prüfung für den Anschluss – TalentTuner

+0

Siehe auch http://StackOverflow.com/a/578083/12484 für eine sauberere Möglichkeit, den Schema + Host + Port von einer URL zu bekommen (sobald Sie eine haben). –

+0

Klingt so, als ob du im integrierten Modus liegst, nicht im klassischen Modus (was ich glaube, dass du auf deinem lokalen Rechner spielst). Das Problem besteht darin, dass Request in Application_Start in IIS7 nicht verfügbar ist. Werfen Sie einen Blick auf: http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx Was erklärt es schön. –

Antwort

59

Wenn Ihre Webanwendung gestartet wird, wird keine HTTP-Anforderung verarbeitet.

Möglicherweise möchten Sie die Methode Application_BeginRequest (Object Sender, EventArgs e) definieren, in der der Request-Kontext verfügbar ist.

Edit: Hier ist ein Codebeispiel von dem Blog der Mike Volodarsky inspiriert, die Michael Shimmins verknüpft:

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

Warum unten abstimmen? Dies ist ein korrekter Vorschlag. –

+3

Sollte das nicht "Uri uri = context.Request.Url;" sein, könnte auch die nächste Zeile nicht vereinfacht werden auf "uri.GetLeftPart (UriPartial.Authority);" –

+0

sollte dies auch eine statische Klasse sein und du don muss den Host nicht initialisieren. – Steve

7

Die akzeptierte Antwort ist gut, aber in den meisten Fällen (wenn die erste Anforderung eine HTTP Anfrage) sollten Sie besser das Session_Start Ereignis verwenden, das einmal pro Benutzer alle 20 Minuten oder so aufgerufen wird (nicht sicher, wie lange die Sitzung gültig ist). Application_BeginRequest wird bei jeder Anfrage ausgelöst.

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

einfach zu beantworten diese so, wenn jemand jemals zu diesem Thema eigentlich suchen entscheidet ...

Dies funktioniert beim Start der Anwendung in einem beliebigen Modus ...

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

Bitte beachten Sie, dass das Feld nicht öffentlich (d. H. Privat) ist. Sie sollten sehr vorsichtig sein, nicht dokumentierte Features und Felder zu verwenden, da sie sich ohne weitere Informationen ändern können. –

+0

Und wie unterscheidet es sich von 'HttpContext.Current.Request' ??? Ich sehe das gleiche Ergebnis – Andrii

Verwandte Themen