2012-01-12 2 views
14

Использование текущего запроса я могу получить URL-имя хоста с:Определить имя хоста URL без использования HttpContext.Current?

HttpContext.Current.Request.Url.Host 

Но - мне нужно, чтобы определить URL-имя хоста без использования текущего запроса (HttpContext.Current). Причина этого в том, что мой код вызывается из SqlDependency в обратном вызове onChange, когда найден SQL-зависимость. Althougth код находится в моем веб-приложении, запрос отсутствует, а HttpContext.Current - null.

Я надеялся, что смогу схватить его с HttpRuntime, но там, похоже, ничего не может быть. есть ли способ получить эту информацию?

+0

Один из наших веб-сайтов отвечает на любые имя хоста. Без проверки входящего запроса было бы сложно определить имя хоста, используемое для нас. – spender

+0

Что вы пытаетесь сделать, и точно, когда ваш код запущен? Является ли это событием OnChange SqlDependency, в приложении Cache's onRemoveCallback или где-то еще? – Journey

+0

Отредактировал вопрос для наглядности –

ответ

3

Если вы знаете хозяина в данный момент вы настраиваете обработчик событий, то вы должны быть в состоянии сделать что-то вроде (код на самом деле не тестировался):

string host = HttpContext.Current.Request.Url.Host; 
var dep = new SqlDependency(cmd); 
dep.OnChange += ((sender, args) => 
{ 
    DoStuff(host); 
}); 
+0

Привет, я тоже к этому обратился, поэтому, предполагая, что я могу перенести свой код из Application_OnStart на что-то вроде Session_OnStart (чтобы сделать объект Request avaialable), я могу передать его на хост, как вы предлагаете. –

4

Как насчет

Environment.MachineName 
+0

Извините, но это не сработает, у меня есть несколько экземпляров в одном окне с различными привязками хостов (site1.xxx.com, site2.xxx.com и т. Д.) –

+0

Интересно, возможно ли тогда для определения контекста, в котором выполняется ваш код, если отсутствует HttpContext (как вы сказали). –

1

Вы должны использовать API IIS для запроса информации с веб-сайта, который вы ищете. Поскольку в зависимости от конфигурации IIS ваш URL или имя хоста могут отличаться. (Подумайте о hostheaders, порты, протоколы и прочее, как это.

A Введение в API IIS можно найти на http://learn.iis.net/page.aspx/165/how-to-use-microsoftwebadministration/

+0

Это похоже на единственный способ сделать это, однако для запроса IIS требуются дополнительные разрешения, поэтому я думаю, что мне может понадобиться проверить, могу ли я кодировать эту проблему. –

6

Если вы работаете это из веб-приложения, и все это управляемый код, то HttpContext должен существует ли ваша дочерняя библиотека (если ваш управляемый код находится в библиотеке) имеет ссылку на System.Web? Если нет, подумайте над добавлением этой ссылки. С этой точки вы должны иметь прямой доступ к HttpContext, используя полное пространство имен :

System.Web.HttpContext.Current.Request.Url.Host 

В любом случае, если ваш код неуправляемый или ваш con текст действительно не создается с помощью веб-приложения, HttpContext должен быть доступен в каждой точке, пока поток жив.

Edit:
основе читать ваш комментарий ниже, это звучит как SqlDependency стреляют независимо друг от друга. Хотя он находится в одном потоке, он не запускается непосредственно по запросу. Поскольку все, что вы ищете, это URL-адрес хоста, не исключено, что вы можете создать переменную приложения или статическую переменную для хранения этой информации в случае, если она необходима для зависимости.

Также я увидел, что, хотя HttpContext.Current может быть недоступен, HttpContext.Request может быть. Они должны быть одним и тем же объектом, но это необязательно. Возможно, там находится Хозяин.

+1

HttpContext существует, но HttpContext.Current (который является текущим запросом) этого не делает, потому что код в веб-приложении не инициируется запросом, его инициирует обратный вызов SQL Dependency, поэтому он является нулевым. –

+0

Можете ли вы установить поле «Страница» на «HttpContext.Current» (например, _currentContext) и получить к нему доступ в обратном вызове? – jrummell

+0

@MattRoberts: Добавлено редактирование. –

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