Глобальный 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"]
Спасибо,
Фил.