Вопрос

У меня есть веб-приложение, которое хранит объект конфигурации в ApplicationState.Этот объект, помимо прочего, содержит строку подключения к базе данных.

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

Однако, поскольку в этом потоке нет HttpContext, я не могу получить доступ к объекту конфигурации.

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

Все эти внутренние классы в .net действительно раздражают.

Это было полезно?

Решение

Просто передайте все, что хотите, в свою ветку при ее запуске.Использовать Параметризованный потокреадстарт делегировать, чтобы запустить его, а не просто Начало темы делегат.Вы можете либо передать его HttpContext.Current, либо объединить информацию, которую вы хотите, чтобы ваш поток имел, и передать ее.

Другие советы

Если вы Действительно нужен доступ к состоянию приложения (или аналогичному) из асинхронных обработчиков, вам следует изменить свой HttpApplication подкласс (например,Global.asax) для хранения экземпляра состояния приложения (this.Application) к статическому свойству во время Application_Start:

public static HttpApplicationStateWrapper State { get; private set; }

protected void Application_Start()
{
    State = new HttpApplicationStateWrapper(this.Application);
}

Для регистрации этого экземпляра было бы более целесообразно использовать инфраструктуру DI, но если она у вас есть, вы, вероятно, могли бы вообще отказаться от использования состояния приложения для хранения конфигурации.Кроме того, в .NET имеется структура конфигурации, которая напрямую удовлетворяет эту потребность и обеспечивает возможность чтения конфигурации из любого места.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top