Как запретить ashx сбрасывать тайм-аут сеанса?

У меня проблемы с поиском какой-либо информации об этом, что заставляет меня думать, что я делаю что-то не так. Я сделал ashx, который предоставляет защищенные изображения нашим зарегистрированным пользователям. Проблема в том, что трассировка Sql Profiler показывает, что TempResetTimeout вызывается в нашей базе данных состояний сеанса для каждого изображения, обслуживаемого с помощью этого механизма. Этот ashx был создан для замены aspx, который раньше делал то же самое, но вызывал множество взаимоблокировок базы данных состояния сеанса из-за большого количества изображений и использования веб-сада, yada, yada. Это определенно улучшение из-за того, что на один вызов «Read Committed» для базы данных состояния сеанса меньше, но тот факт, что есть обновление, означает, что у нас все еще могут быть взаимоблокировки. По сути, мы не хотим НИКАКОГО взаимодействия с сеансом при использовании этого ashx, но, похоже, этого не происходит.

У меня, конечно, нет реализованного интерфейса IRequiresSessionState, поэтому я считаю, что мой ashx никоим образом не должен касаться Session. Однако я вижу попадание Global.asax в каждом случае, и Global.asax ссылается на сеанс в некоторой части своего кода. Это заставило меня попытаться исключить эту конкретную страницу из какой-либо аутентификации с помощью следующего в web.config...

<location path="ImageHandler.ashx">
<system.web>
    <authentication mode="None" />
</system.web>
</location>

... но это приводит к тому, что ashx вообще не срабатывает (изображение не отображается, и точка останова не попадает в ProcessRequest). Я не уверен, почему это происходит.

Как я могу заставить мой ashx ImageHandler не касаться сеанса ВООБЩЕ?


person Tim Hardy    schedule 28.08.2009    source источник
comment
Было бы неплохо, если бы я мог предотвратить вызов Global.asax при ссылке на этот ashx, но я не знаю, как это сделать и возможно ли это вообще.   -  person Tim Hardy    schedule 28.08.2009
comment
Обратите внимание, что IRequiresSessionState и IReadOnlySessionState говорят только о «значениях состояния сеанса» и все. Нигде не говорится, что он не будет читать файл cookie сеанса и загружать сеанс для данного запроса страницы (и, таким образом, сбрасывать тайм-аут).   -  person Adam Sills    schedule 31.08.2009


Ответы (1)


SessionState настраивается на уровне приложения, поэтому единственный способ отключить сеанс для любого запроса ASP.NET — поместить его в собственное приложение в IIS и включить состояние сеанса. выключенный.

<system.web>
    <sessionState mode="Off" />
</system.web>

http://msdn.microsoft.com/en-us/library/h6bb9cz9.aspx

Вы также можете создать свой собственный модуль состояния сеанса (возможно, пытаясь обернуть существующий), но это также потребует конфигурации IIS для настройки другой папки в качестве приложения или замены ее в корневом приложении.

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemodule.aspx

Хотя это кажется намного более трудным, чем просто отключить его для одной подпапки, настроенной как приложение в IIS.

person Adam Sills    schedule 31.08.2009
comment
Настройка папки, содержащей мой ashx, в качестве приложения и отключение сеанса для этого приложения звучит как путь. Спасибо за вашу помощь. - person Tim Hardy; 03.09.2009