Получить имя хоста без использования HttpRequest - PullRequest
8 голосов
/ 29 января 2010

Я хочу запустить «фоновое задание» в моем приложении ASP.NET (периодически, как отдельный поток). И мне нужно имя хоста (DNS-имя или IP) для выполнения моих задач. Проблема в том, что HttpContext.Current может быть недоступен здесь (это NULL).

Есть ли способ получить имя хоста, не используя HttpContext.Current.Request.Url.Host.

Ответы [ 4 ]

8 голосов
/ 29 января 2010

Когда имя хоста доступно в HttpContext.Request.Url.Host, оно является результатом того, что имя хоста является частью запроса, отправленного клиентом. В качестве примера возьмем запрос на эту страницу:

GET /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1
Host: stackoverflow.com
...

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

Немного не по теме: запуск запланированных задач в веб-приложении вызывает проблемы, а порождающие потоки имеют дело только с некоторыми из них. Если это вообще возможно, рассмотрите возможность запуска запланированных заданий из службы Windows, возможно построенной с использованием инфраструктуры, подобной NCron .

1 голос
/ 29 января 2010

Имейте в виду, что начинать эту "фоновую работу" из веб-приложения - плохая идея, если вам нужен этот фоновый процесс для круглосуточной работы независимо друг от друга. Даже если вы начнете это в новой теме. Ваше веб-приложение может не иметь запросов в течение некоторого времени. В этом случае время выполнения отключит процесс и все его «дочерние» потоки. Для непрерывной работы вам нужно запустить его как службу Windows. В противном случае Даррен прав, используйте System.Net.Dns.GetHostName ().

1 голос
/ 29 января 2010

вероятно, вы можете добавить переменную класса в свой класс потока и установить эту переменную с помощью request.url.host перед запуском класса потока.

этот метод также может применяться к объекту сеанса.

0 голосов
/ 06 июня 2011

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

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

...