Foros del Web » Programación para mayores de 30 ;) » .NET »

Error Concurrencia entre distintas sesiones .NET

Estas en el tema de Error Concurrencia entre distintas sesiones .NET en el foro de .NET en Foros del Web. Hola mi problema es que estooy desarrollando una aplicación de Servicio Web que utiliza DLL de otra aplicación Cliente Servidor, mi problema viene dado por ...
  #1 (permalink)  
Antiguo 13/01/2010, 02:07
 
Fecha de Ingreso: marzo-2007
Mensajes: 6
Antigüedad: 17 años, 1 mes
Puntos: 0
Error Concurrencia entre distintas sesiones .NET

Hola mi problema es que estooy desarrollando una aplicación de Servicio Web que utiliza DLL de otra aplicación Cliente Servidor, mi problema viene dado por la concurrencia entre las sessiones del servicio Web, ya que fallan algunos metodos y por más que utilizo la intrucción:

Lock("nombre")
{
//Código del método.
}

No funciona correctamente, sé que podría utilizar la opción Application.Lock() pero ya que dichas DLL se encuentran en una solución aparte y son para cliente servidor no se si sería recomendable poner una referencia Web.

Algún consejo por favor.

Un saludo.
  #2 (permalink)  
Antiguo 13/01/2010, 03:27
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Error Concurrencia entre distintas sesiones .NET

Exactamente que problema tienes para no poder resolver varias peticiones de forma concurrente? Podrias poner un poco más de información?

Yo uso bastantes soluciones basadas en Cliente-Servidor (y usando también WebServices) y no estoy teniendo ningún tipo de problema por ello.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 13/01/2010, 03:59
 
Fecha de Ingreso: marzo-2007
Mensajes: 6
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Error Concurrencia entre distintas sesiones .NET

Hola Gracias por la pronta respuesta.

El problema es el siguiente o lo que creo que puede ser.

1.- en un DLL de la solución cliente servidor tengo una variable estatica que esta dentrod e un Lock("estatica") esa variable por ejemplo es un Datatable, el cual voy alimentando a modo de una cache particular según se vaya necesitando, recordar que esta dentro de un Lock.

2.- Cuando envio una petición al web service con el IIS recien reiniciado y dejo que esta petición termine, luego lanzo 12 solicitudes simultaneas y todo funciona perfectamente.

3.- Cuando con el IIS recien reiniciado lanzo las 12 solicitudes simultaneas todo va mal, ya que ocurren excepciones en el código que no tendrían porque ocurrrir porque las 12 solicitudes son exactamente iguales, además puede que no ocurra en todos los mensajes enviados al web service, solo en algunos y otros se ejecuten correctamente.

A mi parecer el Lock no se esta comportando como deberia comportarse, con lo cual la concurrencia de sessiones al web service esta afectando la ejecución de mi sistema.

Se que el problema es dado por la concurrencia ya que si en lugar de lanzar las 12 solicituddes simultaneamente, las pongo en un timer de 5 segundos, todo va perfecto, ahora bien he ido reduciendo el tiempo del timer y a los 3,5 segundos ya todo va mal.

¿Qué puede ser lo que este mal?.

Muchas gracias y un saludo.
  #4 (permalink)  
Antiguo 13/01/2010, 05:16
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Error Concurrencia entre distintas sesiones .NET

Cuando dices un Datatable, trabajas con un objeto Datatable guardado en el servidor (por ejemplo una variable de sesión o similar) o estás trabajando contra una BBDD? Si es esto último, es la propia BBDD quien controla los accesos concurrentes.

Para que te hagas una idea, uno de mis webservice hace como unos 30-50 insert's de forma "simultanea" (cada insert es de una llamada de webservice difernete) a la bbdd por segundo, no uso locks y no tengo ningún tipo de problema.

Puedes pegar la excepción que te dá? Si puede ser el mensaje entero (principalmente: Exception.ToString() y Exception.StackTrace).
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 13/01/2010, 05:56
 
Fecha de Ingreso: marzo-2007
Mensajes: 6
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Error Concurrencia entre distintas sesiones .NET

tal como digo un datatable, podria ser un arraylit o un hashtable, no tiene nada que ver con base de datos, el problema está en que el flujo que deberia seguir es.

Supongamos 3 hilos simultaneos.

Hilo 1: verifica la variable y esta vacia, la carga mientras el hilo 2 y 3 deben estar a la espera de que este cargada.

el stack trace que lanza solamente me dice que otro metodo tiene una variable que es null, cuando no deberia serlo, porque si ha pasado bien por el metodo que te digo nunca debería ser null, además como es posible que fallen algunas llamadas y otras no si son las mismas.

no he podido conseguir un stacktrace claro en el método que te comento, pero si puedo lo adjunto en otra respuesta de este post.

¿Con los datos que tienes puedes ayudarme en algo?.
  #6 (permalink)  
Antiguo 13/01/2010, 07:10
 
Fecha de Ingreso: marzo-2007
Mensajes: 6
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Error Concurrencia entre distintas sesiones .NET

Hola Como cada vez que ejecuto el ciclo de pruebas el error es distinto, aqui te pongo uno de los tantos tipos de error que me dan.


Aqui esta la excepción

System.Web.Services.Protocols.SoapException: El servidor no puede procesar la solicitud. ---> System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.


Y esta es la traza.

System.Web.Services.Protocols.SoapHttpClientProtoc ol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
en System.Web.Services.Protocols.SoapHttpClientProtoc ol.Invoke(String methodName, Object[] parameters)
en Test.MiWebService.PeticionElectronica.SolicitudCit a(String Login, String Password, String CodAreaHospitalaria, String HL7) en C:\SVNNET2008\Integracion\PeticionElectronica\Test \Web References\MiWebService\Reference.cs:línea 78
en Test.Form1.PruebaThread() en C:\SVNNET2008\Integracion\PeticionElectronica\Test \Form1.cs:línea 79
  #7 (permalink)  
Antiguo 13/01/2010, 09:25
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Error Concurrencia entre distintas sesiones .NET

Sin ver los códigos es complicado porque es ir a ciegas. Yo en tu lugar tendría el webservice en localhost para poder depurarlo. Pondria puntos de interrupción en los diferentes hilos. Ejecutaría el programa de forma que no pete (tal y como me dijiste en tu punto 2 de la primera respuesta) y luego que pete y ver que diferencias hay.
__________________
Aviso: No se resuelven dudas por MP!
  #8 (permalink)  
Antiguo 14/01/2010, 02:38
 
Fecha de Ingreso: marzo-2007
Mensajes: 6
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Error Concurrencia entre distintas sesiones .NET

Un ejemplo podria ser.

public class ClaseProblema
{
private static HashTable s_mihash = null;

static ClaseProblema
{
s_mihash = new Hashtable();
}


public static object LeerHash(string clave)
{
Lock("LeerHash")
{
if (s_mihash.ContainsKey(clave))
{
return s_mihash[clave];
}
else
{
//cargar en s_michash los datos de BD y devolver el object
}
}
}
}


Claro está que la excepción no me falla aqui, sino que me falla en la devolución de este dato fuera de la clase, es decir al crear un objeto en una este a su vez tiene un objeto de esta clase de ejemplo, el constructor debe llamar a este estatico y cargarlo si no esta, mi problema es que por más que le pongo el Lock estoy seguro de que más de una session intentan cargar el Hash a la vez y esto falla, con lo cual el objeto en la clase externa es null y por eso me ocurre la excepción en el otro lado.

No se si me he explicado bien.

¿Alguna Idea?.

Un saludo.

Etiquetas: distintas, sesiones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:27.