Определить имя хоста URL без использования HttpContext.Current? - PullRequest
15 голосов
/ 12 января 2012

Используя текущий запрос, я могу получить имя хоста URL с:

HttpContext.Current.Request.Url.Host

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

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

Ответы [ 4 ]

7 голосов
/ 12 января 2012

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

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

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

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

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

4 голосов
/ 12 января 2012

Как насчет

Environment.MachineName
3 голосов
/ 12 января 2012

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

string host = HttpContext.Current.Request.Url.Host;
var dep = new SqlDependency(cmd);
dep.OnChange += ((sender, args) =>
{
    DoStuff(host);
});
1 голос
/ 12 января 2012

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

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

...