Определить имя 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/