Как получить полное имя хоста + номер порта в Application_Start из Global.aspx? - PullRequest
49 голосов
/ 22 ноября 2010

Я пытался

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

, и он хорошо работал на моей локальной машине, но при публикации в IIS7 есть исключение, говорящее

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

Кто-нибудь знает, как этого добиться

Ответы [ 3 ]

60 голосов
/ 22 ноября 2010

Когда ваше веб-приложение запускается, запрос HTTP не обрабатывается.

Возможно, вы захотите определить метод Application_BeginRequest (Object Sender, EventArgs e), в котором доступен контекст запроса.

Редактировать: Вот пример кода, вдохновленный блогом Майка Володарского, с которым Майкл Шимминс связал:

    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;
        }
    }
9 голосов
/ 05 декабря 2013

Принятый ответ хорош, но в большинстве случаев (если первый запрос является HTTP-запросом) вам лучше использовать событие Session_Start, которое вызывается один раз для пользователя каждые 20 минут или около того (не знаю, как долгосеанс действителен).Application_BeginRequest будет срабатывать при каждом запросе.

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}
2 голосов
/ 19 марта 2015

Просто отвечаю на это, так что если кто-то решит на самом деле искать по этой теме ...

Это работает при запуске приложения в любом режиме ...

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