Как получить свойства HttpContext, когда он возвращает значение null?
-
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.