2010-11-22 16 views
47

PróbowałemJak uzyskać pełną nazwę hosta + numer portu w Application_Start of Global.aspx?

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

i to działało dobrze na moim komputerze lokalnym, ale kiedy są publikowane na IIS7, istnieje wyjątek mówiąc

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

Każdy wie, jak to osiągnąć?

+0

czek na porcie – TalentTuner

+0

Zobacz także http://stackoverflow.com/a/578083/12484 dla czystszego sposobu uzyskania schematu + host + port z adresu URL (gdy już go masz). –

+0

Wygląda na to, że używasz trybu zintegrowanego, a nie klasycznego (co, jak sądzę, działasz na komputerze lokalnym). Problem polega na tym, że żądanie nie jest dostępne w Application_Start w IIS7. Zajrzyj na: http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx Co wyjaśnia ładnie. –

Odpowiedz

59

Po uruchomieniu aplikacji internetowej nie jest obsługiwane żadne żądanie HTTP.

Może zajść potrzeba zdefiniowania metody Application_BeginRequest (Object Sender, EventArgs e), w której dostępny jest kontekst Request.

Edit: Oto przykładowy kod inspirowana blogu Mike'a Volodarsky że Michael Shimmins związane z:

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

Po co to głosować? To jest właściwa sugestia. –

+3

Czy to nie powinno być 'Uri uri = context.Request.Url;' nie może również uprościć następnej linii do 'uri.GetLeftPart (UriPartial.Authority);' –

+0

to powinno być również klasą statyczną i ty Trzeba zainicjować hosta. – Steve

7

Zaakceptowanych odpowiedź jest dobra, ale w większości przypadków (jeśli pierwsze żądanie jest HTTP Żądanie) powinieneś lepiej użyć zdarzenia Session_Start, które jest wywoływane raz na użytkownika co 20 minut (nie wiem, jak długo sesja jest ważna). Application_BeginRequest zostanie wyrzucony na każde żądanie.

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

Wystarczy odpowiedzieć na to tak, jeśli ktoś kiedykolwiek zdecyduje się faktycznie szukać na ten temat ...

Działa to na początku aplikacji w dowolnym trybie ...

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

należy pamiętać, że pole jest niepubliczne (tj. Prywatne). Powinieneś bardzo uważać, aby używać nie udokumentowanych funkcji i pól, ponieważ mogą one ulec zmianie bez dodatkowych informacji. –

+0

A czym różni się od 'HttpContext.Current.Request' ??? Widzę ten sam wynik – Andrii

Powiązane problemy