Вопрос

Я работаю над проектом ASP.NET, который использует внутренний разработанный пользовательский сеансStateProvider Class.

Очевидно, что событие Session_OnStart не стремится. У меня есть код в Global.Asax для обработки события. Я могу только получить этот код для выполнения, изменив Web.config для использования сеанса по умолчанию.

Что я должен сделать, чтобы сделать код SESSION_ONSTART выполнить, когда я использую Custom SessionStateProvider Class? У меня есть доступ к исходному коду.

Обновлять: Это ясно говорит на MSDN, который обычно, Session_OnStart Только пожары, когда режим сеанса INPROC, поэтому мне придется сделать что-то особенное, чтобы получить это проводной способ, которым я это хочу.

Конфигурация состояния моей сессии в web.config выглядит так:

< sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom"  
 customProvider="ProgramSessionStateProvider"  
 sessionIDManagerType="SessionIDManager.ProgramSessionIDManager"  
sqlConnectionString="SqlSessionServices" cookieName="smartSessionID" >
< providers >
            < add name="ProgramSessionStateProvider"   
type="SessionStateProvider.ProgramSessionStateProvider"   
connectionStringName="SqlSessionServices" writeExceptionsToEventLog="false" / >  
        < /providers >
    < /sessionState >

Обновить еще раз: Я нашел что-то интересное сегодня утром. После прочтения ответа Криса я пытался использовать только клиента SessionStateProvider и удалил код для пользовательского SessionIDManager. Отказ Однажды я сделал это, я сразу смог увидеть Session_OnStart метод выполняется. Проблема в том, что мой обычай SessionStateProvider требует обычай SessionIDManager. Отказ Где именно Session_OnStart Событие с увольнением? Похоже, это связано с SessionIDManager, не SessionStateProvider.

Это было полезно?

Решение

Второй ответ, занимающийся пользовательскими сессии. При взгляде на код я не видел никаких причин, по которым он не позвонит начать сессию, поэтому я попытался создать свой собственный соответствующий, но нефункциональный поставщик государств-сеансов, чтобы увидеть, что происходит. С моим поставщиком состояния сеанса он назвал Session_Start в Global.Asax Fine. Я включаю свой код в качестве демонстрации концепции:

Государственный поставщик сессии:

namespace WebApplication1
{
    public class SessionStateProvider : System.Web.SessionState.SessionStateStoreProviderBase
    {
        public override SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout)
        {
            ISessionStateItemCollection foo = new SessionStateItemCollection();
            HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
            return new SessionStateStoreData(foo, bar, 300);
        }
        public override void CreateUninitializedItem(HttpContext context, string id, int timeout){}
        public override void Dispose() { }
        public override void EndRequest(HttpContext context) { }
        public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
        {
            locked = false;
            lockAge = TimeSpan.FromSeconds(10);
            lockId = new object();
            actions = SessionStateActions.None;
            ISessionStateItemCollection foo = new SessionStateItemCollection();
            HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
            return new SessionStateStoreData(foo, bar, 300);
        }
        public override SessionStateStoreData GetItemExclusive(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
        {
            locked = false;
            lockAge = TimeSpan.FromSeconds(10);
            lockId = new object();
            actions = SessionStateActions.None;
            ISessionStateItemCollection foo = new SessionStateItemCollection();
            HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
            return new SessionStateStoreData(foo, bar, 300);
        }
        internal virtual void Initialize(string name, NameValueCollection config, IPartitionResolver partitionResolver) { }
        public override void InitializeRequest(HttpContext context) { }
        public override void ReleaseItemExclusive(HttpContext context, string id, object lockId) { }
        public override void RemoveItem(HttpContext context, string id, object lockId, SessionStateStoreData item) { }
        public override void ResetItemTimeout(HttpContext context, string id) { }
        public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) { }
        public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback){return true;}
    }
}

Global.Asax:

    protected void Session_Start(object sender, EventArgs e)
    {
        throw new Exception("It worked!");
    }

web.config:

    <sessionState mode="Custom" customProvider="MySessionProvider">
        <providers>
            <add name="MySessionProvider" type="WebApplication1.SessionStateProvider"/>
        </providers>
    </sessionState>

Точка этого поста в основном говорит, что если вы используете предоставленный модуль управления сеансом, даже с пользовательским поставщиком, он все еще должен отключить событие Session_Start. Возможно, вы можете попробовать с моим уставным поставщиком Pumy State и посмотрите, отключит ли это от вашего мероприятия. Также я предполагаю, что подпись вашей сессии_ОНстарта на самом деле правильная? (т.е. нет параметров или (объект, eventargs)).

В настоящее время мы находимся в положении DUFF, потому что вся информация, которую мы имеем до сих пор, это по неправильным строкам. Теперь мы остались ни с кем-то о вашем SessionStateProvider, вызывает сессию_Start не стрелять или что-то о остальной части вашего кода. Использование моего манекена должна помочь нам ответить на этот вопрос (я надеюсь).

Для того, что стоимость события Session_Start должна быть уволена сразу после CreateNewStoreData Метод запускается в классе вашего провайдера, чтобы вы могли попробовать поместить там точку останова и просто увидеть, где он делает голову до этого метода.

Другие советы

Редактировать: Похоже, я немного пропустил вопрос на вопрос слегка. Я собираюсь оставить этот ответ здесь, хотя только потому, что это может представлять интерес для некоторых. Не стесняйтесь комментировать, если вы думаете, что это должно быть удалено, хотя.

Извините, это ответ, так как я не на 100% уверен в том, что я говорю, но это было слишком долго, чтобы быть комментарием ...

Я не был уверен, что вы создали пользовательский модуль сеанса или JSUT-поставщика состояния сеанса. Я предполагаю, что модуль, но я не был уверен, что просто «SessionStateProvider» ...

Из того, что я могу сказать, что любой httpмодуль, добавленный в web.config, пройдет процесс попытки подключиться к событиям в Global.Asax. Как это происходит, похоже, ищет методы формы «{name} _ {события}» или «{name} _on {событие}» и подключите их вверх, где я думать Это имя - это имя, которое вы дали модуль в вашем web.config, и {Event}, конечно, это имя события в классе (то есть начало).

Поэтому, по сути, если ваш новый модуль включен так:

<add name="MySession" type="MySessionStateModule" />

Тогда вы бы хотели в вашем Global.Asax MySession_Start

Надеюсь, это поможет. Извините, если это не так и все вещи, которые вы пробовали раньше. Я бы предложил дать немного кода и некоторые идеи того, что вы уже пробовали, и это не удалось. Код, который может быть интересен, - это то, где вы добавляете свой пользовательский код в сайт (т. Е. Подходящая часть web.config) и, возможно, какой-то код в классе сеанса, если его можно легко сократить до тривиальной формы (например, поставщик сеансов, который Просто возвращает константу может быть коротко и продемонстрировать вашу ошибку). Также некоторые указания о том, сохраняют ли это состояние сеанса или нет (т. Е. Это работает отдельно, а не вызов на onstart) будет хорошим. :)

Редактировать, чтобы добавить: Я думал, что свяжу один из полезных веб-страниц, которыми я столкнулся. http://aspnetresources.com/articles/event_handlers_in_global_asax. Переговоры о том, как стандартные обработчики ошибок подключены в Global.Asax и указали мне на интересный метод CookupEventHandLerforflersFlivationandlandlerersFlersFlivionAvationAndultule, которые дали мне ключ к тому, как некоторые из них могут работать.

Я догадаюсь, что оперативная цель - сделать что-то вроде, скажем, инициализировать сеанс, а не нужно, чтобы конкретно сделать что-то в методе Session_onStart. Предполагается, что это так, я думаю, что вы можете сделать следующее:

1) Обрабатывать Appection.PostacquirereVetState событие.
2) в обработчике, проверьте, инициализируется ли сеанс - способ плохого человека - установить переменную на сеансе - затем действовать соответствующим образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top