2011-02-03 11 views
17

Tengo un problema con GenericHandler y anonymousIdentification.ASP.NET Generic Handlers & Session

Básicamente si <anonymousIdentification enabled="true" /> está activado en la configuración web, cada vez que se envía una solicitud JQuery GET/POST al servidor, esa solicitud se ejecuta con un nuevo usuario y una nueva sesión de usuario.

¿Hay alguna manera de mitigar esto? Necesito acceder a las variables de sesión del usuario actual ... ¡Es realmente frustrante!

+0

No he comprobado, pero creo que si va a enviar un jQuery LLEGAR req. desde Cliente, entonces se maneja en el contexto de usuario actual ... verifique con fiddler la cookie de sesión de ASP.net igual para ambas solicitudes, normal y jquery –

+0

¿Entonces si desactiva la ID anónima, funciona? ¿Estás usando las formas de autenticación? ¿Puedes desactivar anon para esa ruta particular en el web.config? – jcolebrand

+0

Voy a tratar de ver si esto funciona @drachenstern. Estás equivocado @Shekhar_Pro. Guardo datos de usuario en la sesión; un valor es UserRegistratinoState. Si procedo de una página donde el usuario acaba de registrar el valor enum en la sesión, es UserRegistrationState.Registered. Yo he verificado esto Sin embargo, cuando llamo al manejador desde js en la otra página, la primera línea de código en el manejador verifica esa variable de sesión. Si la variable no existe, automáticamente devuelve UserRegistrationState.Anonymous. Creo que es seguro asumir que las solicitudes Get de JQuery se están ejecutando bajo un nuevo usuario. – bleepzter

Respuesta

38

Los controladores genéricos deben implementar la interfaz IReadOnlySessionState para acceder a las variables de sesión. Si también necesita escribir variables de sesión, implemente IRequiresSessionState.

+1

Voy a intentar esto en un momento. Gracias @Josh Stodola – bleepzter

+2

Debería leer: ** public class MemberHandler: IHttpHandler, IRequiresSessionState ** –

+0

Tuve el problema de que el handler no devolvió la cookie de sesión si request to handler fue el primero en el sitio web (no identificador de sesión real) y Pensé que cuando 'IReadOnlySessionState' derive de 'IRequireSessionState' será suficiente. Pero realmente tenía que usar 'IRequireSessionState' explícitamente. Gracias por esa publicación. – jgasiorowski

-2

Sugiero que en el navegador web habilite la pestaña de red en el modo de desarrollador. Luego, compruebe en el AJAX qué cookie se envía (si corresponde).

Si no ve ninguna cookie, significa que el navegador no recibió ninguna sesión, por lo que debe asegurarse (como lo indica Josh) de heredar la interfaz correcta y acceder a la cookie. (Don'f se olvide de utilizar System.Web.SessionState)

Con el fin de generar la cookie, acceda Id.sesión del objeto de sesión:

string sesId = context.Session.SessionID; 

Antes se escribe nada a la respuesta.

+1

-1 Es muy posible y plausible tener un estado de sesión sin cookies, y el acceso al identificador ciertamente no "genera" la cookie –

+0

Eso no es lo que dije, vuelva a leer. –

+0

Lo leí tres veces. No necesito leerlo de nuevo. –

1

Puede utilizar esta:

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

implementar la interfaz 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

Quiero obtener valores de sesión en el controlador genérico para cargar imágenes en la clave principal que he almacenado en la sesión, estoy usando el plugin de carga de imágenes jquery y vincula todas las propiedades en documentos listos. utilicé iRequiresSessionState en mi código de controlador, pero todavía no puedo acceder a los valores de la sesión. las claves de sesión todavía son 0. ¿alguien puede decirme sobre esto? –