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

StackOverflow https://stackoverflow.com/questions/529286

  •  22-08-2019
  •  | 
  •  

Вопрос

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

ThreadPool.QueueUserWorkItem()

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

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

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

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

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

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

3- Перестроить проект веб-части.Сделанный!

ссылка

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

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

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

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

Вот хорошая запись о многопоточность в ASP.NET из MSDN.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top