Получение HttpContext из процесса BackgroundWorker - PullRequest
4 голосов
/ 19 августа 2010

У меня есть сайт ASP.NET, и я выполняю некоторую работу по рефакторингу кода, чтобы попытаться удалить некоторые долго выполняющиеся процессы (порядка часа) из фактического HTTP-запроса, создав BackgroundWorker и отправив работу чтобы обрабатывать. Это работало нормально на урезанных тестах, но когда я применил логику к реальному коду, я обнаружил проблемы с доступом к переменным Session из кода, работающего в Background Worker. Похоже, что переданный объект HttpContext имеет нулевой сеанс, и если я запрашиваю HttpContext.Current, я получаю нулевое значение обратно.

Я предполагаю, что это потому, что они находятся в другом потоке, и что сессия и HttpContext.Current зависят от того, находятся ли они в одном потоке. Есть ли какой-нибудь способ получить доступ к сеансу от фонового работника, или я застрял в поиске всех переменных, которые мне нужны из сеанса, и помещении их в пригодную для использования структуру данных и последующем их последующем возвращении в сеанс (при необходимости)? Очевидно, это сильно усложняет рефакторинг, если мне нужно сделать это, поэтому я бы предпочел не делать этого.

Спасибо за любые ваши мысли. Я открыт для других предложений о том, как я могу сделать это, кроме процессов BackgroundWorker (которые были предложены мне в другом вопросе).

Ответы [ 2 ]

1 голос
/ 08 августа 2014

Здесь ссылка MSDN, которая проливает свет на это.В частности текст:

Если метод асинхронного действия вызывает службу, которая предоставляет методы с использованием шаблона BeginMethod / EndMethod, метод обратного вызова (то есть метод, который передается в качестве параметра асинхронного обратного вызова дляМетод Begin) может выполняться в потоке, который не находится под управлением ASP.NET.В этом случае HttpContext.Current будет нулевым , и приложение может столкнуться с условиями гонки, когда оно получит доступ к членам класса AsyncManager, таким как Параметры.Чтобы убедиться, что у вас есть доступ к экземпляру HttpContext.Current и чтобы избежать условия гонки, вы можете восстановить HttpContext.Current, вызвав Sync () из метода обратного вызова .

1 голос
/ 19 августа 2010

Я не уверен во всех ваших требованиях, но вы можете избежать использования кэша приложений вместо сеанса, если вам не нужен длительный процесс, который будет привязан к запросу отдельного пользователя.

Если это так, я бы попытался заменить ваше использование Session на:

HttpRuntime.Cache.Set("CacheKeyName");
HttpRuntime.Cache.Get("CacheKeyName");
...