Подтвердить что ты не робот

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

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

ThreadPool.QueueUserWorkItem()

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

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

Тем не менее, HttpContext.Current имеет значение null, когда я создаю этот отдельный поток.

Вопрос

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

4b9b3361

Ответ 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.