2011-02-03 30 views
17

Ho un problema con GenericHandler e anonymousIdentification.Gestori e sessione generici ASP.NET

Fondamentalmente se <anonymousIdentification enabled="true" /> è attivato nella configurazione Web, ogni volta che una richiesta JET GET/POST viene inviata al server, tale richiesta viene eseguita con un nuovo utente e una nuova sessione utente.

C'è un modo per mitigare questo? Ho bisogno di accedere alle variabili di sessione dell'utente corrente ... È davvero frustrante!

+0

non ho controllato, ma credo che se si sta inviando un jQuery GET REQ. dal client viene gestito nel contesto dell'utente corrente. Verificare con il violinista che il cookie di sessione di ASP.net sia lo stesso per la richiesta normale e di jquery –

+0

Quindi, se si disattiva l'ID anonimato, funziona? Stai utilizzando l'autenticazione Forms? Puoi disattivare anon per quel particolare percorso in web.config? – jcolebrand

+0

Proverò a vedere se funziona @drachenstern. Hai sbagliato @Shekhar_Pro. Memorizzo i dati dell'utente nella sessione; un valore è UserRegistratinoState. Se provengo da una pagina in cui l'utente ha appena registrato il valore enum nella sessione è UserRegistrationState.Registered. Ho verificato questo. Tuttavia, quando chiamo il gestore da js su un'altra pagina, la prima riga di codice nel gestore controlla quella variabile di sessione. Se la variabile non esiste, restituisce automaticamente UserRegistrationState.Anonimo. Penso che sia sicuro presumere che le richieste Get da JQuery siano eseguite con un nuovo utente. – bleepzter

risposta

38

I gestori generici devono implementare l'interfaccia IReadOnlySessionState per accedere alle variabili di sessione. Se è anche necessario scrivere variabili di sessione, implementare IRequiresSessionState.

+1

Ci proverò tra un attimo. Grazie @Josh Stodola – bleepzter

+2

Dovresti leggere: ** public class MemberHandler: IHttpHandler, IRequiresSessionState ** –

+0

Ho riscontrato che il gestore non ha restituito il cookie di sessione se la richiesta al gestore era la prima del sito Web (nessun ID di sessione effettivo) e Ho pensato che quando 'IReadOnlySessionState' deriva da 'IRequireSessionState' che sarà sufficiente. Ma ho davvero dovuto usare 'IRequireSessionState' in modo esplicito. Grazie per questo post. – jgasiorowski

-2

Suggerisco nel browser Web di abilitare la scheda di rete in modalità sviluppatore. Quindi controlla in AJAX quale cookie viene inviato (se presente).

Se non viene visualizzato alcun cookie, significa che il browser non ha ricevuto alcuna sessione, pertanto è necessario assicurarsi (come dichiarato da Josh) di ereditare l'interfaccia corretta e accedere al cookie. (Don'f dimenticare di usare System.Web.SessionState)

Per generare il cookie, l'accesso sessionID dell'oggetto sessione:

string sesId = context.Session.SessionID; 

Prima si scrive di tutto per la risposta.

+1

-1 È molto possibile e plausibile avere uno stato di sessione senza cookie, e l'accesso all'identificatore certamente non "genera" il cookie –

+0

Questo non è quello che ho detto, riletto. –

+0

L'ho letto tre volte. Non ho bisogno di leggerlo di nuovo. –

1

È possibile utilizzare questo:

public class Handler : 
    IHttpHandler, 
    System.Web.SessionState.IReadOnlySessionState 
11

implementare l'interfaccia System.Web.SessionState.IRequiresSessionState:

public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    {  
    context.Session["StackOverflow"] = "overflowing";  
    context.Response.Redirect("~/AnotherPage.aspx");  
    } 

} 
+0

Voglio ottenere i valori di sessione nel gestore generico per caricare l'immagine sulla chiave primaria che ho archiviato in sessione, sto usando il plugin per il caricamento delle immagini jquery e lega tutte le proprietà sul documento pronto. Ho usato iRequiresSessionState nel mio codice gestore, ma ancora non riesco ad accedere ai valori di sessione. le chiavi di sessione sono ancora 0. Qualcuno può dirmi su questo? –