2010-02-01 4 views
6

У меня есть приложение ASP .Net, работающее на IIS7. Я использую текущий URL-адрес, на котором работает сайт, чтобы установить некоторые статические свойства для класса в моем приложении. Чтобы сделать это, я получаю имя домена с помощью этого (insde статического конструктора класса):Как получить доменное имя хоста в ASP.NET без использования HttpContext.Current.Request?

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

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

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

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

ответ

8

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

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

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

+0

Ах, да, то, что я на самом деле должен делать, это не инициализация этого материала в статическом конструкторе. На самом деле, если я хочу быть в безопасности, я бы даже не хотел, чтобы мои ценности были статическими вообще - я должен искать их снова по каждому запросу, если я получаю запросы от нескольких доменов (в моем случае я выиграл " t, но хорошо знать об этом). Спасибо за помощь - к сожалению, теперь мне нужно реорганизовать больший кусок этого унаследованного приложения, чем мне хотелось бы =) – Badjer

1

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

-4

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

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

+1

Это только дает вам путь, а не домен. – Dementic

Смежные вопросы