Global ASAX - получить имя сервера
Кто-нибудь может мне сказать, есть ли способ получить доменное имя моего сайта в событии Application_Start в global.asax?
Обычно я просто получаю его из Context.Request.ServerVariables["SERVER_NAME"], но это недоступно. В идеале я также хотел бы получить URL-адрес из запроса, который запустил приложение.
Хм - из ответов ниже может показаться, что присутствие на IIS7 имеет значение здесь. Это новое, и теперь есть рекомендации по дизайну, чтобы попытаться остановить вас от этого:
6 ответов
Вы можете получить доступ к контексту через статический член HttpContext.Current.
HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
HttpContext.Current.Request.Url;
Редактировать, основываясь на некоторых ваших комментариях, я провел дополнительное исследование
Эта ошибка связана с изменением конструкции в интегрированном конвейере IIS7, из-за которого контекст запроса становится недоступным в событии Application_Start. При использовании классического режима (единственный режим при работе в предыдущих версиях IIS) контекст запроса был доступен, хотя событие Application_Start всегда предназначалось как глобальное и независимое от запроса событие в жизни приложения. Несмотря на это, поскольку приложения ASP.NET всегда запускались при первом запросе к приложению, раньше было возможно получить доступ к контексту запроса через статическое поле HttpContext.Current.
Итак, у вас есть два варианта
- Измените код приложения, чтобы не использовать контекст запроса (рекомендуется).
- Переместите приложение в классический режим (НЕ рекомендуется).
Ваше веб-приложение может работать в нескольких разных доменах. Поскольку в Application_Start
событие, вы не можете знать, в каком домене будет вызываться приложение.
Однако вы можете узнать имя машины, используя System.Environment.MachineName
,
Я предполагаю, что вы находитесь на IIS 7? Потому что HttpContext доступен там на IIS 6.0.
Можете ли вы рассмотреть возможность заполнения этой информации позже? Первый звонок Application_BeginRequest
например?
В VB.NET, в Global.asax я использую следующее:
Hosting.HostingEnvironment.ApplicationHost.GetSiteName
Это соответствует имени приложения в IIS.
ОБНОВЛЕНИЕ: Кажется, метод "GetSiteName" не предназначен для непосредственного вызова, и он больше не работает для меня в Visual Studio 2015 (или, может быть, это потому, что я изменил версию фреймворка). Я исправил это, заменив это:
System.Web.Hosting.HostingEnvironment.SiteName
Есть ли у вас доступ к объекту запроса вообще? Если это так, я думаю, вы могли бы использовать Request.Url.Authority
Он вернет имя хоста DNS, которое вы ищете.
г
Ты пытался: -
System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"]
Спасибо,
Фил.