2010-04-23 17 views
5

Tengo una aplicación asp.net y servicios web (asmx) que residen en la misma aplicación pero no en la misma carpeta de los archivos aspx. También tengo una aplicación winform que usa los servicios web. He marcado los métodos de servicio web con [WebMethod (EnableSession = true)] pero no puedo compartir los mismos valores de sesión que están en la aplicación en los servicios web. La aplicación WinForm tiene acceso a la Id.sesión de la aplicación y estoy usando el siguiente códigoCompartiendo sesión entre el servicio web y la aplicación asp.net

Uri uri = new Uri(ServerServiceUrl); 
_cookieContainer = new CookieContainer(); 
_cookieContainer.Add(new Cookie("ASP.NET_SessionId", SessionID, "/", uri.Host)); 

Mi pregunta es: ¿Hay algo que me falta o hacer el mal que no puedo acceder al sessioin aplicación de los servicios web?

+3

¿Por qué necesita sesiones en un servicio web? ¿Estás almacenando un estado temporal? En ese caso, los servicios de IMO deberían ser apátridas y, por lo tanto, su problema no existiría ... – Sunny

+0

De acuerdo, tendrá que pensar en servicios web como clases estáticas – Pierreten

+0

Mis servicios aspx, al igual que la aplicación, hable con webservices de Java y cuando la aplicación llama a los servicios guarda en caché los valores por un período de tiempo. En lugar de llamar a los servicios de Java una y otra vez, quiero utilizar los datos que la aplicación ha almacenado en caché. De ahí por qué quiero compartir la sesión. –

Respuesta

1

No puedo arrojar ninguna luz sobre por qué no puede tener la aplicación de winforms "secuestrar" la sesión: lo que está haciendo parece que debería hacer exactamente lo que quiere.

Solo quería sugerirle que use la caché de la aplicación (para almacenar en caché la respuesta de su servicio java) en lugar del almacén de sesión del usuario. Esto tiene las siguientes ventajas: -

  • a) Si la información almacenada en caché es aplicable a más de un usuario individual (por ejemplo, acceso controlado), entonces la misma información almacenada en caché puede ser utilizado por varios usuarios y no exagerado para cada sesión .
  • b) Usted tiene más control sobre cuánto tiempo almacenan en caché las cosas/cuando son recogidas de lo que obtiene con los datos de la sesión (que solo dura toda la sesión y corre el peligro de crecer y crecer si se olvida eliminar información antigua)
  • c) Si no logra que su secuestro de sesión funcione, puede acceder a los datos en la memoria caché desde cualquier sesión.
0

¿Has probado a heredar tu clase de servicio web desde System.Web.SessionState.IRequiresSessionState?

Normalmente se utiliza para manejadores de http, pero los servicios web parecen usar la misma interfaz de marcador.

+0

No lo he intentado, pero según tengo entendido, al agregar [WebMethod (EnableSession = true)] en cada método, se habilita la sesión. Tengo una variable de sesión disponible, simplemente es que es una sesión nueva y no la sesión ya se ha creado en la aplicación. –

+0

Acaba de darse cuenta. ¿Estás accediendo al servicio web desde la misma máquina? en ese caso, ¿está seguro de que debería usar "uri.Host" y no la interfaz de bucle invertido al configurar su cookie? – Radu094

Cuestiones relacionadas