Как получить полное имя хоста + номер порта в Application_Start of Global.aspx?
Вопрос
Я старался
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
Кто-нибудь знает, как это добиться?
Решение
Когда ваше веб-приложение начинается, нет HTTP-запроса обрабатывается.
Вы можете обрабатывать определить метод define_beginrequest (объект отправителя, 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;
}
}
Другие советы
Принятый ответ хорош, но в большинстве случаев (если первый запрос - это запрос HTTP), вы должны лучше использовать Session_Start
Событие, которое вызывается один раз на пользователя каждые 20 минут или около того (не уверена, как долго сеанс действителен). Application_BeginRequest
будет уволен по каждому запросу.
public void Session_Start(Object source, EventArgs e)
{
//Request / Request.Url is available here :)
}
Просто отвечаю на это, так что если кто-то когда-нибудь решит на самом деле поиск по этой теме ...
Это работает по приложению начать в любом режиме ...
typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)