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