У меня есть следующий пример кода, который используется в приложении ASP.NET MVC. Целью этого кода является создание запроса «огонь и забухание» для очередей в течение долгого времени.ASP.NET HttpContext.Current внутри Task.Run
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
Я знаю, что это не лучший способ для обработки HttpContext.Current в асинхронном коде, но в настоящее время наша реализация не позволяет нам делать что-то другое. Я хотел бы понять, насколько этот код опасен ...
Вопрос: ли теоретически возможно, что установка HttpContext внутри Task.Run, установит контекст совершенно другой запрос?
Я думаю, да, но я не уверен. Как я понимаю: Request1 обрабатывается с Thread1 из пула потоков, тогда, когда Thread1 обрабатывает абсолютный другой запрос (Request2), код внутри Task.Run устанавливает контекст из Request1 в Request2.
Возможно, я ошибаюсь, но мои знания об элементах ASP.NET не позволяют мне правильно его понять.
Спасибо!
Не проще ли просто получить информацию из HttpContext, которая вам нужна, а не передать весь HttpContext? (Я понимаю, что это не отвечает на ваш вопрос, но мне любопытно, что нужен весь контекст). – vcsjones
Правильно, это очень правильный путь, но, к сожалению, в настоящее время я не могу его изменить. Наш код имеет доступ к HttpContext.Current глубоко внутри бизнес-логики и его изменение - это огромные усилия, которые в настоящее время у нас нет. –
Не связанный с вашим вопросом - работа с длительным сроком работы в веб-контексте - отличная идея - сервер может быть перезапущен, и в пуле только столько потоков, как только вы закончите нить, вы перестанете обслуживать запросы. Вы считали что-то вроде HangFire или Quartz? –