Global ASAX - получить имя сервера

Кто-нибудь может мне сказать, есть ли способ получить доменное имя моего сайта в событии Application_Start в global.asax?

Обычно я просто получаю его из Context.Request.ServerVariables["SERVER_NAME"], но это недоступно. В идеале я также хотел бы получить URL-адрес из запроса, который запустил приложение.


Хм - из ответов ниже может показаться, что присутствие на IIS7 имеет значение здесь. Это новое, и теперь есть рекомендации по дизайну, чтобы попытаться остановить вас от этого:

Блог IIS

6 ответов

Решение

Вы можете получить доступ к контексту через статический член HttpContext.Current.

HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
HttpContext.Current.Request.Url;

Редактировать, основываясь на некоторых ваших комментариях, я провел дополнительное исследование

Эта ошибка связана с изменением конструкции в интегрированном конвейере IIS7, из-за которого контекст запроса становится недоступным в событии Application_Start. При использовании классического режима (единственный режим при работе в предыдущих версиях IIS) контекст запроса был доступен, хотя событие Application_Start всегда предназначалось как глобальное и независимое от запроса событие в жизни приложения. Несмотря на это, поскольку приложения ASP.NET всегда запускались при первом запросе к приложению, раньше было возможно получить доступ к контексту запроса через статическое поле HttpContext.Current.

Итак, у вас есть два варианта

  1. Измените код приложения, чтобы не использовать контекст запроса (рекомендуется).
  2. Переместите приложение в классический режим (НЕ рекомендуется).

http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart/

Ваше веб-приложение может работать в нескольких разных доменах. Поскольку в 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"]

Спасибо,

Фил.

Другие вопросы по тегам