Получение ApplicationState в asp.net без HttpContext - PullRequest
1 голос
/ 23 марта 2009

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 23 марта 2009

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

0 голосов
/ 26 января 2012

Если вам действительно нужен доступ к состоянию приложения (или аналогичному) из асинхронных обработчиков, вам следует изменить свой подкласс HttpApplication (например, Global.asax), чтобы сохранить экземпляр состояния приложения (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 имеется инфраструктура конфигурации, которая напрямую решает эту проблему и предоставляет возможность считывать конфигурацию из любого места.

...