Получение ApplicationState в asp.net без HttpContext

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

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

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

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

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

2 ответа

Решение

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

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

public static HttpApplicationStateWrapper State { get; private set; }

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

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

Другие вопросы по тегам