2009-06-01 36 views
6

Tenemos un servicio web .mx asmx al que se llama desde javascript (usando ASP.Net AJAX) y requiere acceso a Session.¿Acceso de solo lectura a la sesión en una llamada al servicio web?

[WebMethod(true)] 
public string DoSomethingOnTheServer() { } 

Nos encontramos con el problema de la sesión bloqueada en una solicitud de lectura/escritura. ¿Hay alguna forma de marcar un método de servicio web como que requiere acceso de solo lectura a la sesión?

Gracias!

Respuesta

0

Según el MSDN documentation del atributo WebMethod, existen varias propiedades posibles, por lo que no estoy seguro de qué va a hacer el valor 'verdadero' en su atributo WebMethod.

Ha intentado:

[WebMethod(EnableSession=true)] 

Según this document que debe darle acceso completo a la sesión.

+0

El problema es que el método permite tanto el acceso de lectura ... Estoy buscando una manera de para activar el acceso de lectura (activar el acceso de escritura causa bloqueo cuando tiene varias solicitudes simultáneas). Sin embargo, no creo que haya una manera. – Jonas

+2

Ah, ja, ahora veo ... Ahora que he hecho un poco más de búsqueda, no tiene mucho sentido que pueda configurar una página para tener acceso de solo lectura, pero no un servicio web. ¿Qué sucede si coloca WebMethods en una página aspx (expuesta como WebMethods) y configura la propiedad EnableSessionState de la página como ReadOnly? No es la mejor solución, pero podría funcionar. – PhillFox

4

Esta página de http://msdn.microsoft.com/en-us/library/aa480509.aspx parece sugerir que la respuesta es "no" - no puede marcar una WebSerivce como teniendo EnableSessionState=ReadOnly.

Si realiza llamadas simultáneas al servicio web desde el mismo proceso, las solicitudes se serializarán en el servidor para que solo una se ejecute en cualquier momento. A diferencia de las páginas .ASPX que tienen soporte para el acceso de solo lectura al objeto HttpSessionState, que permite el procesamiento simultáneo de múltiples solicitudes, no existe tal capacidad con los servicios web ASP.NET. Todas las llamadas a métodos web con sesiones habilitadas tienen acceso de lectura/escritura y serán serializadas dentro de cada sesión.

Advertencia: Ese artículo es viejo (2002).

+0

viejo, pero parece que todavía se aplica :( – quetzalcoatl

1

Este es un hilo muy viejo, pero me encontré con él en mi búsqueda por una respuesta a la misma pregunta.

he encontrado la respuesta en otro lugar, y lo dejará aquí para otras internets en mi lugar:

En Global.asax puede especificar para cada solicitud, lo que acceder a la solicitud debe tener al objeto de sesión y por lo tanto, si debe bloquear o no. servicios asmx

private void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // This will set the session to read only for asmx services 
    // This will make the asmx services non blocking for other requests as it doesnt lock the session object 
    if (Context.Request.Path.Contains(".asmx/")) 
    { 
     Context.SetSessionStateBehavior(SessionStateBehavior.ReadOnly); 
    } 
} 

esta manera siempre sólo han acceso de sólo lectura a la sesión y no bloquearán otras solicitudes

Cuestiones relacionadas