Локальное хранилище запросов в ASP.NET (доступно для кода из реализации IHttpModule) - PullRequest
1 голос
/ 23 марта 2010

Мне нужно, чтобы какой-то объект зависал между двумя интересующими меня событиями: PreRequestHandlerExecute (где я создаю экземпляр своего объекта и хочу сохранить его) и PostRequestHandlerExecute (где я хочу добраться до объект). После второго события объект не нужен для моих целей и должен быть удален либо хранилищем, либо моим явным действием. Таким образом, идеальный контекст, в котором мой объект должен храниться, - на запрос (с гарантированным отсутствием проблем совместного использования, когда разные потоки обслуживают запросы ... или процессы / серверы :))

Примите во внимание, что фактическая реализация, которую я могу сделать, сделана из HttpModule и должна быть подключаемым решением для уже написанных веб-приложений (поэтому опция для предоставления некоторого состояния с использованием статических переменных / переменных экземпляра в Global.asax не делает ' Не очень хорошо - мне придется изменить Global.asax на каждом веб-приложении.

Кеш, кажется, слишком широк для этого использования. Я пытался понять, подходит ли httpContext.Application (типа HttpApplicationState) для меня или нет, но не могу определить, является ли он точно для HttpApplication экземпляра или нет (AFAIK, вы можете использовать несколько экземпляров HttpApplication s на разные потоки и, следовательно, обслуживают несколько запросов одновременно - тогда использование хранилища, совместно используемого потоками, не будет работать правильно, иначе я бы использовал его, потому что один экземпляр HttpApplication обслуживает ровно один запрос за раз). Что-то можно сделать с сохранением состояния в экземплярах HttpModule, если я точно знаю, что он точно привязан 1-к-1 при каждом запущенном экземпляре HttpApplication (но опять же мне нужно доказательство того, что экземпляр HttpApplication равен 1-к-1 с моим экземпляром HttpModule). Любые ценные и уважаемые ссылки на эти темы очень ценятся ...

Было бы замечательно найти что-то особенно подходящее для ситуации с запросом (потому что в противном случае я мог бы получить что-то сверхъестественное ... возможно, какое-то "более широкое" хранилище с областями действия и некоторые хаки, чтобы иметь разные ключи в хранилище для разных запрашивает, ИЛИ, используя локальную вещь потока, и таким образом придерживается теории, что IIS / ASP.NET никогда не будет обслуживать первое событие из одного потока и второе событие из другого потока и т. д.)

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

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

2 голосов
/ 23 марта 2010

попробуй HttpContext.Current.Items коллекция. По запросу.

...