Как получить свойства HttpContext, когда он возвращает null?
Я выполняю асинхронную работу над отдельным потоком, используя:
ThreadPool.QueueUserWorkItem()
и в этом отдельном потоке мне нужно вызвать HttpContext.Current
, чтобы я мог получить доступ:
HttpContext.Current.Cache
HttpContext.Current.Server
HttpContext.Current.Request
Тем не менее, HttpContext.Current
имеет значение null, когда я создаю этот отдельный поток.
Вопрос
Как создать новый поток, чтобы HttpContext.Current
не был нулевым? Или есть ли другой способ доступа к объектам Cache, Server и Request?
Ответы
Ответ 1
Я бы попытался не ссылаться на объект, который зависит от стека ASP.NET, такого как HttpContext. Если вам нужно выполнить некоторую работу в другом потоке, это потому, что вы не хотите ждать в ASP.NET до завершения своей задачи. И, возможно, запрос/Контекст/сеанс завершается, пока ваш поток не работает.
Вы должны передать объект с данными, необходимыми для вашего потока.
Ответ 2
Вы можете получить доступ к кешу ASP.NET с HttpRuntime.Cache, даже если у вас нет HttpContext, но, к сожалению, вы не можете получить доступ к серверу или запросу.
Если вы думаете об этом, это имеет смысл - вы не обслуживаете ни одну страницу, чтобы у вас не было запроса.
Ответ 3
1- Добавить нижний код в <system.serviceModel>
в файл Web.config:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2- Добавить нижний код после NameSpace в файле веб-службы:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3- Перестроить проект веб-части.
Готово!
ссылка
Ответ 4
Для служб HttpContext.Server вы можете использовать класс HttpServerUtility.
Для кэша вы можете использовать HttpRuntime.Cache, как было сказано выше.
Для объекта запроса вы можете передать данные из запроса в поток при его создании. Такие вещи, как Request.QueryString или Request.Form... или что-то еще.
Ответ 5
Существует реализация пула потоков здесь, которая обеспечивает распространение HTTP-контекста вызывающего потока. Я еще не использовал его, но планирую.
Ответ 6
Если отдельный поток пытается получить доступ к этим объектам, тогда да, они будут пустыми. Эти объекты ограничены уровнем нити. Если вы хотите использовать их в новом потоке, вам придется передать их в метод/класс, где они вам нужны.
Как правило, ASP.Net не позволяет создавать новые потоки... Вот post по теме.
Вот хорошая запись в Threading в ASP.NET из MSDN.