ASP.NET - получить URL-адрес веб-сайта без HttpContext.Current (выполняется в фоновом потоке)

Немного длинно, но есть ли в ASP.NET способ динамически получать URL-адрес веб-сайта (http://www.example.com), когда HttpContext.Current недоступен.

HttpContext отсутствует, потому что код выполняется в фоновом потоке * (но в домене приложений ASP.NET). У меня есть фоновый процесс, который отправляет электронные письма каждый вечер и должен включать веб-адрес, но я не хочу жестко кодировать его из-за развертываний и тестирования (он меняется с http://localhost:12345 на http://testing.example.com, а затем на http://www.example.com для действующего сайта).

* Пожалуйста, не советуйте службу Windows, я знаю об этом, но ограничения хостинга не позволяют мне это сделать.


person Sunday Ironfoot    schedule 03.08.2010    source источник


Ответы (2)


Ваше приложение должно создать и запустить поток. В момент создания потока HttpContext.Current должен быть доступен, сохранить соответствующую часть веб-адреса, которая важна, и либо передать конструктору вашего объекта, который обертывает функциональность потоковой передачи, либо, если у вас нет настраиваемого объекта , сохраните его в месте, где поток может получить к нему доступ. Вам нужно будет войти в критический раздел с помощью lock () {}, если вы используете второй подход.

person David    schedule 03.08.2010
comment
Спасибо! Я думал об этом, меня просто беспокоит, так как потенциально могут быть разные URL-адреса для доступа к веб-сайту. Например, кто-то может ввести localhost на сервере для доступа к сайту, и он навсегда сохранит адрес как localhost, в том числе в отправленных электронных письмах. Извините, я знаю, что это звучит немного непонятно, я просто переживаю из-за этого, может быть, я слишком сильно перерабатываю это. - person Sunday Ironfoot; 03.08.2010
comment
Я понимаю беспокойство. Если localhost, то это интерактивный пользователь на самом сервере, запустивший веб-приложение. Вы могли бы поместить код запуска потока в Application_BeginRequest и запускать поток только тогда, когда текущий запрошенный адрес не является localhost и, возможно, даже не является внутренним адресом (то есть: должен быть полным квалифицированным адресом). Если вы это сделаете, вам нужно будет установить флаг после запуска потока и заблокировать, чтобы доступ для чтения / записи был синхронизирован. - person David; 03.08.2010

Судя по вашим странным ограничениям на хостинг (серьезно, просто купите вместо этого приличный сервер, это избавит вас от многих проблем), вы запускаете поток со страницы ASP.NET. Просто введите URL-адрес, когда вы запускаете поток, и сохраните его в поле.

person Matti Virkkunen    schedule 03.08.2010
comment
Купить новый сервер? Это совершенно бесполезно и не решает проблему, просто позволяет ее избежать. - person mwalker; 03.08.2010
comment
@mwalker: Я знаю, что это не решает проблему, но это действительно нужно делать через службу. Кроме того, если вы не заметили, я также предоставил решение ... - person Matti Virkkunen; 03.08.2010
comment
@Matti Downvote может быть несправедливым, но это законная проблема, общий хостинг довольно распространен, и не каждый может позволить себе 50–100 фунтов стерлингов в месяц за виртуальный / выделенный хостинг. Даже в надлежащих компаниях с выделенным оборудованием / серверами все еще могут существовать неудобные особенности развертывания и / или ограничения, особенно если они размещены на внешних клиентских серверах. - person Sunday Ironfoot; 03.08.2010
comment
@Matti Действительно, в ярости я не заметил реального решения. Голос против отклонен. - person mwalker; 03.08.2010
comment
Я тоже поставлю +1 за добрую волю. В будущем вы можете помещать совет по поводу отсутствия ответа в конце ответа, а не в начале, чтобы важные моменты не пропустили ленивый взгляд. - person David; 03.08.2010
comment
@David: На самом деле мой отказ от ответа был переплетен с фактическим ответом примерно на четверть пути. Это было не в самом начале! - person Matti Virkkunen; 03.08.2010