Определить имя URL-адреса без использования HttpContext.Current?
Используя текущий запрос, я могу получить имя хоста URL:
HttpContext.Current.Request.Url.Host
Но - мне нужно определить имя хоста URL без использования текущего запроса (HttpContext.Current
). Причина этого заключается в том, что мой код вызывается из SqlDependency
в обратном вызове onChange, когда обнаружена зависимость SQL. Althougth код находится в моем веб-приложении, запрос отсутствует, а HttpContext.Current
- null.
Я надеялся, что смогу схватить его с HttpRuntime
, но там, кажется, нет ничего полезного. есть ли способ получить эту информацию?
Ответы
Ответ 1
Если вы знаете хост в тот момент, когда вы настраиваете обработчик событий, вы должны иметь возможность сделать что-то вроде кода (фактически не протестированного):
string host = HttpContext.Current.Request.Url.Host;
var dep = new SqlDependency(cmd);
dep.OnChange += ((sender, args) =>
{
DoStuff(host);
});
Ответ 2
Если вы используете это из веб-приложения, и все это управляемый код, то должен существовать HttpContext. Имеет ли ваша дочерняя библиотека (при условии, что ваш управляемый код находится в библиотеке) имеет ссылку на System.Web? Если нет, подумайте о добавлении этой ссылки. С этой точки вы должны иметь доступ к HttpContext напрямую, используя полное пространство имен:
System.Web.HttpContext.Current.Request.Url.Host
В любом случае, если ваш код неуправляемый или ваш контекст действительно не создается с помощью веб-приложения, HttpContext должен быть доступен в каждой точке, пока поток жив.
Изменить:
Основываясь на чтении вашего комментария ниже, похоже, что SqlDependency запускается независимо. В то время как он находится в том же потоке, он не запускается непосредственно по запросу. Поскольку все, что вы ищете, это URL-адрес хоста, не исключено, что вы можете создать переменную приложения или статическую переменную для хранения этой информации в случае, если она необходима для зависимости.
Также я видел, что, хотя HttpContext.Current
может быть недоступен, может быть HttpContext.Request
. Они должны быть одним и тем же объектом, но это необязательно. Возможно, там находится Хост.
Ответ 3
Как насчет
Environment.MachineName
Ответ 4
Вы должны использовать api IIS для запроса информации с веб-сайта, который вы ищете. Поскольку в зависимости от конфигурации IIS ваш URL или имя хоста могут отличаться. (Подумайте о хостерах, портах, протоколах и т.д.
Введение для IIS API можно найти на http://learn.iis.net/page.aspx/165/how-to-use-microsoftwebadministration/