Указание сеанса только для чтения в ASP.NET MVC
Можно ли указать, что данный Контроллер или Действие использует состояние сеанса только для чтения? В "старом" ASP.NET мы делали что-то вроде этого:
<%@ Page EnableSessionState="ReadOnly" %>
Есть ли эквивалент ASP.NET MVC? Я хочу, чтобы мое приложение одновременно обслуживало несколько запросов от одного и того же клиента, и полностью отключить сеанс - это не вариант в моем случае.
Ответы
Ответ 1
Здесь был задан аналогичный вопрос: Отключить состояние сеанса по запросу в ASP.Net MVC
Принятый ответ касается создания настраиваемого обработчика маршрута, который в конечном итоге пропускает привязку к сеансу. Это точно не отвечает на ваш вопрос (как объявить несколько действий для использования доступа к readonly сеансу), но это было достаточно актуально, чтобы упомянуть.
Ответ 2
В Asp.Net MVC3 теперь есть SessionStateAttribute
, который вы можете украсить своим контроллером, чтобы принудительно активировать все действия в режиме Read-Write, Read-only или No session.
http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute(v=VS.98).aspx
Ответ 3
Это может быть немного сложно - я понимаю, что настройка состояния сеанса - это то, что произошло на уровне IHttpHandler. С помощью пользовательских обработчиков вы можете указать состояние сеанса с помощью интерфейсов маркеров, таких как IReadOnlySessionState, чтобы объявить, что для этого требуется только состояние только для чтения. Вы можете попробовать добавить это к своему контроллеру и посмотреть, как он летает. Я подозреваю, что это не произойдет, потому что контроллеры ASP.NET mvc произойдут после того, как IHttpHandler подключен, но это стоит того.
Другим решением может быть обертывание переменных состояния сеанса в вашем собственном классе и выставлять версию с версией для чтения только для чтения. Доступ к нему по нескольким запросам не должен быть проблемой, но вы правы, что можете получить условия гонки и такие, если вы начинаете пытаться писать одни и те же переменные сеанса с разных ракурсов.
Ответ 4
Как насчет того, чтобы данные, которые вы хотите "читать только", как статические в вашей модели? Таким образом, вы можете иметь одновременные запросы к MVC с теми же данными.