Глобальный ASAX - получить имя сервера

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

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


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

Блог IIS

Ответ 1

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

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

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

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

Итак, у вас есть две опции

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

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

Ответ 2

Ваше веб-приложение может работать в нескольких разных доменах. Поскольку в событии Application_Start нет текущего запроса, вы не можете знать, в какой области будет вызываться приложение.

Однако вы можете узнать имя машины с помощью System.Environment.MachineName.

Ответ 3

Я предполагаю, что вы на IIS 7? Поскольку HttpContext доступен там в IIS 6.0.

Считаете ли вы позже заполнением этой информации? Первый вызов Application_BeginRequest например?

Ответ 4

В VB.NET, в Global.asax, я использую следующее:

Hosting.HostingEnvironment.ApplicationHost.GetSiteName

Это соответствует имени приложения в IIS.

UPDATE: Кажется, что метод GetSiteName не предназначен для прямого вызова, и он больше не работает для меня в Visual Studio 2015 (или, возможно, это потому, что изменение версии каркаса я сделал). Я исправил его, заменив его на:

System.Web.Hosting.HostingEnvironment.SiteName

Ответ 5

У вас есть доступ к объекту Request вообще? Если так, я думаю, вы могли бы использовать Request.Url.Authority

Он вернет имя хоста dns, которое вы ищете.

С

Ответ 6

Вы пробовали: -

System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"]

Спасибо,

Фил.