Как получить имя домена хоста в ASP .NET без использования HttpContext.Current.Request? - PullRequest
6 голосов
/ 02 февраля 2010

У меня есть приложение ASP .Net, работающее на IIS7.Я использую текущий URL, под которым работает сайт, чтобы установить некоторые статические свойства для класса в моем приложении.Чтобы сделать это, я получаю доменное имя, используя это (например, статический конструктор класса):

var host = HttpContext.Current.Request.Url.Host;

И оно отлично работает на моем компьютере разработчика (Windows XP / Cassini).Однако при развертывании в IIS7 я получаю исключение: «Запрос не доступен в этом контексте».

Я предполагаю, что это потому, что я использую этот код в статическом конструкторе объекта, который выполняется в IIS до того, как поступят какие-либо запросы;и Кассини не вызывает статический конструктор, пока не произойдет запрос.Мне изначально не понравилась идея извлечения доменного имени из запроса по этой самой причине, но это было единственное место, где я его нашел =)

Итак, кто-нибудь знает о другом месте, где яможно получить имя домена хоста?Я предполагаю, что ASP .Net должен знать об этом на каком-то уровне, независимом от запросов Http, я просто не знаю, как получить к нему доступ.

Ответы [ 3 ]

8 голосов
/ 02 февраля 2010

Причина, по которой домен находится в запросе, ... это то, что запрашивается. Например, это несколько сайтов обмена стека от http://www.stackexchangesites.com/:

Если вы пингуете их, вы увидите, что все они указывают на один и тот же IP / веб-сервер и обслуживаются одним и тем же приложением (или несколькими приложениями в данном случае, но пример верен, если это было одно большое). Но приложение не знает, какой именно, пока не появится заголовок хоста с запросом, запрашивающим сервер для этого сайта. Каждый запрос может относиться к другому домену ... поэтому приложение не знает об этом.

Если, однако, это не изменится, вы можете сохранить его как настройку приложения в web.config.

1 голос
/ 02 февраля 2010

Используйте global.asax или напишите HttpModule и подпишитесь, чтобы начать события запроса. Запрос будет передан в ваш обработчик событий.

0 голосов
/ 02 февраля 2010

Используйте это вместо:

HttpRuntime.AppDomainAppVirtualPath

Или, если вы хотите физический путь:

HttpRuntime.AppDomainAppPath

Для дальнейшего чтения:

http://weblogs.asp.net/reganschroder/archive/2008/07/25/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-application-start.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...