Domanda

Sto lavorando su un progetto asp.net che utilizza una classe SessionStateProvider personalizzato in-house sviluppato.

Evidentemente, l'evento Session_OnStart non è sparando. Ho codice in Global.asax per gestire l'evento. Posso solo ottenere questo codice per eseguire cambiando il web.config per utilizzare il SessionStateProvider di default.

Che cosa devo fare per rendere il mio codice Session_OnStart eseguire quando sto usando una classe SessionStateProvider personalizzato? Ho accesso al codice sorgente.

Aggiorna : Si dice chiaramente su MSDN che di solito, Session_OnStart spara solo quando la modalità Session è InProc, così ho intenzione di avere a che fare qualcosa di speciale per ottenere questo cablato come voglio esso.

La mia sessione di configurazione stato negli sguardi web.config in questo modo:

< 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 >

Aggiornamento di nuovo : ho trovato qualcosa di interessante questa mattina. Dopo aver letto la risposta di Chris, ho provato ad utilizzare solo il SessionStateProvider cliente e rimosso il codice per il SessionIDManager personalizzato. Una volta che ho fatto, sono stato subito in grado di vedere il metodo Session_OnStart eseguire. Il problema è, la mia SessionStateProvider personalizzato richiede un SessionIDManager personalizzato. Dove esattamente è l'evento Session_OnStart licenziato da? E sembra che ha a che fare con la SessionIDManager, non il SessionStateProvider.

È stato utile?

Soluzione

Una seconda risposta trattare con SessionStateStores personalizzati. A guardare il codice che ho potuto vedere alcun motivo per cui non avrebbe chiamato inizio sessione in modo ho cercato di creare il mio conforme, ma fornitore di stato della sessione non funzionale per vedere cosa stava succedendo. Con il mio fornitore di stato della sessione è chiamato il Session_Start in fine global.asax. Includo il mio codice come una prova demo di concetto:

Provider stato sessione:

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>

Il punto di questo post è principalmente quello di dire che se si utilizza il modulo di gestione delle sessioni fornito, anche con un provider personalizzato dovrebbe ancora sparare l'evento session_start. Forse si può provare con il mio fornitore dello stato fittizio e vedere se che gli incendi fuori il vostro evento. Anche Presumo che la firma del vostro Session_OnStart è in realtà corretto? (Cioè senza paramaters o (oggetto, EventArgs)).

Al momento siamo in una posizione duff perché tutte le informazioni che abbiamo finora è lungo le linee sbagliate. Ora stiamo lasciati con sia qualcosa sulla tua sessionstateprovider è la causa del session_start non incendio o qualcosa circa il resto del codice è. Usando il mio manichino dovrebbe aiutarci a rispondere a questa domanda (spero).

Per quello che vale la pena l'evento session_start dovrebbe essere licenziato solo dopo che il metodo CreateNewStoreData ha eseguito nella classe fornitore in modo da poter provare a mettere in un punto di interruzione lì e solo vedere dove si fa capo a dopo quel metodo.

Altri suggerimenti

Modifica sembra che ho fatto perdere il punto leggermente sulla questione. Ho intenzione di lasciare questa risposta qui però solo perché può essere di interesse per alcuni. Sentitevi liberi di commentare, se si pensa che dovrebbe essere eliminato però.

Siamo spiacenti questa è una risposta dal momento che io non sono sicuro al 100% di quello che sto dicendo, ma faceva troppo lungo per essere in testa ...

non ero sicuro se si fosse creato un modulo di sessione personalizzato o sono finite un provider dell'archivio di stato di sessione. Sto assumendo il modulo, ma non ero sicuro da solo "SessionStateProvider" ...

Da quello che posso dire qualsiasi HttpModule aggiunto nel web.config passerà attraverso un processo di cercare di collegare a eventi nel global.asax. Il modo in cui fa questo sembra essere, cercando per i metodi di forma "{nome} _ {evento}" o "{nome} _ON {evento}" e il cablaggio da dove avevo che che { nome} è il nome assegnato al modulo nel web.config e {} evento del corso è il nome dell'evento nella classe (cioè iniziare).

Quindi, in sostanza, se il nuovo modulo è incluso in questo modo:

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

allora si vorrebbe in Global.asax MySession_Start

Spero che questo aiuta. Scusate se lo fa, non e la sua tutte le cose che hai provato prima. Io suggerirei di dare un po 'di codice e alcune idee di quello che hai già provato e che non riesce però. Codice che potrebbe essere interessante è dove si aggiunge il codice personalizzato all'interno del sito (cioè la parte appropriata del web.config) e magari un po 'di codice nella classe sessione se può essere facilmente ridotto a una forma banale (ad esempio, un fornitore di sessione che restituisce solo una costante potrebbe essere breve e dimostrare il vostro errore). Anche qualche indicazione se si tratta di mantenere lo stato di sessione o no (cioè funziona a parte non forma chiamando OnStart) sarebbe buono. :)

Modifica per aggiungere: ho pensato a collegare una delle pagine web utili mi sono imbattuto. http://aspnetresources.com/articles/event_handlers_in_global_asax parla di come standard di gestori di errori sono cablati nella global.asax e mi indicò le interessanti HookupEventHandlersForAppplicationAndModules metodo che mi ha dato un indizio su come alcune di queste potrebbe lavorare.

ho intenzione di indovinare l'obiettivo operativo è quello di fare qualcosa di simile, per esempio, inizializzare la sessione piuttosto che dover fare qualcosa di specifico nel metodo Session_OnStart. Presumendo questo è il caso, penso che si può fare quanto segue:

1) Gestire l'evento Appication.PostAcquireRequestState.
2) Nel gestore, controllare se la sessione viene inizializzata - così povero è quello di impostare una variabile nella sessione -. Poi agire in modo appropriato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top