Как не дать Ashx сбросить время ожидания сеанса? - PullRequest
2 голосов
/ 28 августа 2009

У меня проблемы с поиском какой-либо информации по этому поводу, что заставляет меня думать, что я делаю что-то не так. Я сделал Ashx, который предоставляет защищенные изображения нашим вошедшим в систему пользователям. Проблема в том, что трассировка Sql Profiler показывает, что TempResetTimeout вызывается в нашей БД состояния сеанса для каждого изображения, обслуживаемого этим механизмом. Этот ashx был построен, чтобы заменить aspx, который делал то же самое, но вызывал много взаимоблокировок db состояния сеанса из-за большого количества изображений и использования веб-сада, yada, yada. Это, безусловно, улучшение, благодаря одному менее «Read Committed» вызову состояния сеанса db, но тот факт, что есть обновление, означает, что у нас все еще могут быть некоторые взаимоблокировки. По сути, мы не хотим никакого сеансового взаимодействия вообще от использования этого 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 вообще не трогать сессию?

1 Ответ

3 голосов
/ 31 августа 2009

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.

...