2010-07-21 20 views
15

Tengo un servicio web ASMX alojado junto a mi aplicación web ASP.NET. Ahora, necesito obtener la sesión de los usuarios en el servicio web. Para probar esta Hice este método simple:Recibir sesión en .NET ASMX web-service

[WebMethod(EnableSession = true)] 
    public string checkSession() 
    { 
     return HttpContext.Current.Session["userid"].ToString(); 
    } 

Así, en primer inicio mi aplicación web, a continuación, en el navegador Ve a Mis servicio web y haga clic en "checkSession" en la que el auto genera página de prueba. He probado esto en 3 computadoras. Los 3 funcionan bien con la aplicación web (por lo que las sesiones se crean, etc.) y 2 de ellos devuelven el valor de Session ["userid"] al invocar el método web; sin embargo, la última computadora devuelve "Referencia de objeto no configurada en instancia de un objeto "porque Session es nula.

Entonces, ¿cuál es la diferencia entre estas computadoras y por qué mi aplicación ASP.NET puede obtener sesiones en todas las computadoras pero el servicio web no funciona?

+3

¿Cómo está almacenando su sesión? Si está en proceso, necesita que el servicio web de asmx se ejecute en la misma appPool que la aplicación web. ¿Y está obteniendo el error de sesión para esa máquina todo el tiempo? –

+0

Realmente no lo sé. Todo lo que hago es que cuando inicialmente inician sesión en el lado ASP.NET, configuro: Session ["userid"] = theiridfromdb; En primer lugar, ¿cómo puedo verificar si está en proceso y, entonces, cómo puedo ejecutar el servicio web en el mismo apppool? Sí, esa computadora siempre está dando el error. – Matt

+0

Parece que inproc es el predeterminado, así que sí, lo estoy usando. Lo estoy ejecutando en un servidor dedicado que ejecuta IIS6, y el sitio ASP.NET y el servicio web son una sola aplicación. Al igual que en, son la misma aplicación en IIS y Visual Studio compila su back-end en la misma DLL. – Matt

Respuesta

3

Los ID de sesión se almacenan como cookies en el navegador del cliente de forma predeterminada (Session State Overview). Entonces, verifique si esa cookie se está creando correctamente en esa computadora problemática. ¿Tal vez las cookies están deshabilitadas por alguna razón? En ese caso, no enviaría el ID de sesión al servidor cuando está accediendo a ese servicio web.

0

Por servicios web por defecto son y deben ser sin estado. Sin embargo, si debe utilizar la información de la sesión, asegúrese de utilizar las interfaces de marcador IReadOnlySessionState e IRequiresSessionState para acceder, usar o modificar la información del estado de la sesión en el servicio web.

0

mejor manera de hacer este control de enfoque antes de que su sesión no sea nula y en el otro lado inicialice la sesión seleccionada con su valor y cuándo y dónde el servicio web que trabaja con httpcontext.current.session tiene valor.

servicios web son sin estado y la mejor manera es obtener el valor en el servicio web en lugar de un conjunto o inicializar valor de sesión

2

Se puede comprobar el número de procesos de trabajo es la aplicación utilizando? Puede verificarlo en la configuración de su conjunto de aplicaciones en IIS.

Si se utilizan más de un proceso de trabajo, se llama para ejecutar un jardín web. Si ese es el caso, entonces en la sesión de proceso no será útil como esta sesión no se comparte entre los procesos de trabajador. Eche un vistazo a http://www.west-wind.com/weblog/posts/2005/Apr/20/Why-you-shouldnt-use-InProc-Session-State-in-ASPNET

0

El servicio web de forma predeterminada no admite la sesión.Es necesario especificar explícitamente el parámetro en el método Web atribuir

Estas dos cosas funcionan para mí

  1. <add name="Session" type="System.Web.SessionState.SessionStateModule"/> bajo <httpModules>

  2. enableSessionState="true" en <page> etiqueta

+0

¿Es esto 1 Y 2, o 1 O 2? –

+0

1 y 2; Haga el primer paso y luego active sessionState en la página (paso2) –

4

mayo ya es demasiado tarde, pero ha intentado esto:

[WebMethod(EnableSession = true)] 
public string checkSession() 
{ 
    return HttpContext.Current.Session.SessionID 
} 
+1

Esto es exactamente lo que necesitaba saber y solucionó mi problema de sesión nulo. Acabo de poner [WebMethod (EnableSession = true)] en mi método, que devuelve otros datos. ¡Gracias! –

Cuestiones relacionadas