Как получить свойства HttpContext, когда он возвращает значение NULL? - PullRequest
22 голосов
/ 09 февраля 2009

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

ThreadPool.QueueUserWorkItem()

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

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

Однако HttpContext.Current равно нулю, когда я создаю эту отдельную тему.

Вопрос

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

Ответы [ 6 ]

36 голосов
/ 09 февраля 2009

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

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

14 голосов
/ 09 февраля 2009

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

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

3 голосов
/ 11 июня 2012

1 - добавить нижний код в <system.serviceModel> в файле Web.config:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

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

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

ссылка

1 голос
/ 21 апреля 2010

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

1 голос
/ 11 февраля 2009

Для служб HttpContext.Server вы можете использовать класс HttpServerUtility. Для кеша вы можете использовать HttpRuntime.Cache, как было сказано выше. Для объекта запроса вы можете передать данные из запроса потоку при его создании. Такие вещи, как Request.QueryString или Request.Form ... или что-то еще.

0 голосов
/ 09 февраля 2009

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

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

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

...