Как получить свойства HttpContext, когда он возвращает null?
Я выполняю некоторую асинхронную работу в отдельном потоке, используя:
ThreadPool.QueueUserWorkItem()
И в этом отдельном потоке мне нужно вызвать HttpContext.Current
, чтобы я мог получить доступ:
HttpContext.Current.Cache
HttpContext.Current.Server
HttpContext.Current.Request
Однако, HttpContext.Current
равно null, когда я создаю этот отдельный поток.
Вопрос
Как создать новый поток, чтобы значение HttpContext.Current
не было равно null? Или есть другой способ получить доступ к кэшу, серверу и объектам запроса?
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 .