Как получить свойства HttpContext, когда он возвращает null?


Я выполняю некоторую асинхронную работу в отдельном потоке, используя:

ThreadPool.QueueUserWorkItem()

И в этом отдельном потоке мне нужно вызвать HttpContext.Current, чтобы я мог получить доступ:

HttpContext.Current.Cache  
HttpContext.Current.Server  
HttpContext.Current.Request  

Однако, HttpContext.Current равно null, когда я создаю этот отдельный поток.

Вопрос

Как создать новый поток, чтобы значение HttpContext.Current не было равно null? Или есть другой способ получить доступ к кэшу, серверу и объектам запроса?

6 22

6 ответов:

Я бы постарался не держать ссылку на объект, который зависит от ASP.NET стек, как HttpContext. Если вам нужно выполнить какую-то работу в другом потоке, это потому, что вы не хотите ждать в ASP.NET один, пока твоя задача не будет выполнена. И, возможно, запрос / контекст / сеанс завершается, а ваш поток-нет.

Вы должны передать объект с данными, необходимыми для вашего потока.

Вы можете получить доступ к ASP.NET кэш с HttpRuntime.Кэш даже если у вас нет HttpContext, но, к сожалению, вы не можете получить доступ к серверу или запросу.

Если вы подумаете об этом, это имеет смысл - вы не обслуживаете ни одну страницу, поэтому у вас нет запроса.

1-Добавить Нижний код в <system.serviceModel> в Web.конфигурационный файл:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

2-Добавить Нижний код после пространства имен в файл веб-службы:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

3-перестроить проект веб-части. Готово!

Ссылка

Для HttpContext.Серверные службы можно использовать класс HttpServerUtility. Для кэша можно использовать HttpRuntime.Кэш, как уже было сказано выше. Для объекта запроса можно передать данные из запроса в поток при его создании. Такие вещи, как просьба.Строка запроса или запрос.Форма... или еще что-нибудь.

Существует реализация пула потоков здесь, которая обеспечивает распространение контекста HTTP вызывающего потока. Я еще не пользовался им, но собираюсь.

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

Обычно ASP.Net не позволяет создавать новые потоки... Вот сообщение на эту тему.

Вот хорошая запись о резьбе в ASP.NET из MSDN .