none
Concurrencia en WCF con IIS 8.0 RRS feed

  • Pregunta

  • Buenas Tardes,

    Estoy desarrollando un servicio WCf para ser expuesto en IIS 8.0 el servicio se compone de:

     interface:

        [ServiceContract]
        public interface IMCDService
        {
            [OperationContract]
            Respuesta Capturar(string serial);
                    
        }
        [DataContract]
        public class Respuesta
        {
    
            [DataMember]
            public string Mensaje { get; set; }
    
            public Respuesta(string codigo, Parametro datos)
            {
                Codigo = codigo;
                Parametros = datos;
            }
    
            public Respuesta(string codigo, string mensaje)
            {
                Codigo = codigo;
                Mensaje = mensaje;
            }
    
        }

    Implementación :

     [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple) ]
        public class MCDService : IMCDService
        {
            private SolicitudSocket solicitudS;
            private System.Threading.EventWaitHandle eventoSocket;
            private Respuesta respuesta;
    
            
            public Respuesta CapturarHuellas(string serial)
            {
                try
                {
                    eventoSocket = new System.Threading.EventWaitHandle(true, System.Threading.EventResetMode.AutoReset);
                    solicitudS= new SolicitudSocket (IPAddress.Parse(ConfigurationManager.AppSettings.Get("IP_MCD")),
                        int.Parse(ConfigurationManager.AppSettings.Get("Puerto_MCD")), serial);
                    solicitudS.Mensaje += solicitudS_Mensaje;
    
                    eventoSocket.Reset();
    
                    solicitudS.Solicitar();
    
                    if (eventoSocket.WaitOne(50000))// tiempo de 10 segundos promedio
                    {
                        return respuesta;
                    }
                    else
                    {
                        return new Respuesta("MCD_003_010", "Se alcanzó el tiempo máximo de respuesta del MCD.");
                    }
                }
                catch (Exception ex)
                {
                    return new Respuesta("MCD_003_000", ex.Message);
                }
                finally
                {
                    eventoSocket.Dispose();
                    solicitudMCD = null;
                }
            }
    
            void solicitudS_Mensaje(object sender, MensajeEventArgs e)
            {
                respuesta = new Respuesta(e.Codigo, e.Template);
                eventoSocket.Set();
            }

    La idea es que este servicio se comunica a un socket server y espera a que este retorne con el waitforone(), el proceso de espera toma aproximadamente 10 segundos, la concurrencia cuando el servicio y el cliente que lo consumen están en la misma maquina es de 200 solicitudes por segundo pero cuando me llevo este servicio a una maquina en la misma red local con las mismas características de hardware, se pierden muchísimas transacciones, y la concurrencia llega a 6, no se si es un error de configuración del IIS o en el código del servicio, cualquier ayuda será bien recibida.

     

    Cordialmente

     Pacho-B

    jueves, 25 de septiembre de 2014 21:21

Respuestas

  • El cliente es una app de escritorio o web si es de escritorio puedes poner esto en el app.config

    <system.net> <connectionManagement> <clear/> <add address="*" maxconnection="1000" /> </connectionManagement> </system.net>

    una vez me sucedió algo parecido y lo solucione de esta forma

    • Marcado como respuesta Pacho-B viernes, 26 de septiembre de 2014 14:31
    viernes, 26 de septiembre de 2014 14:02

Todas las respuestas

  • Hola,

    Primero te sugeriría que a tu data contract le agregues un constructor vacío (sin argumentos) para temas de serialización,

    en segundo lugar, el socket deberia llamar al servicio de manera asíncrona para darle tiempo al servicio de despachar y no perder llamadas.

    Saludos,

    jueves, 25 de septiembre de 2014 22:36
  • Hola,

    Primero te sugeriría que a tu data contract le agregues un constructor vacío (sin argumentos) para temas de serialización,

    en segundo lugar, el socket deberia llamar al servicio de manera asíncrona para darle tiempo al servicio de despachar y no perder llamadas.

    Saludos,

    referencia: http://msdn.microsoft.com/es-es/library/bbx2eya8%28v=vs.110%29.aspx

    Pero ojo, un cliente tiene un socket que se conecta y no el servicio web es el que genera y se conecta al socket.

    Saludos,

    jueves, 25 de septiembre de 2014 22:40
  • Buenos días Rodrigo,

    Gracias por la sugerencia del constructor vacío lo agregare al data contrac, por otra parte el Socket no llama al servicio WCF es el servicio WCF el que llama al socket y lo hace de manera asíncrona, el problema es que el servicio WCF tiene que retornar a quien lo consuma la respuesta que de el socket por eso se "espera" a que el socket responda con un waitone(), dado que el servicio socket en promedio demora 10 segundos en contestar.

    Cordialmente

    Pacho-B 

    viernes, 26 de septiembre de 2014 13:08
  • El cliente es una app de escritorio o web si es de escritorio puedes poner esto en el app.config

    <system.net> <connectionManagement> <clear/> <add address="*" maxconnection="1000" /> </connectionManagement> </system.net>

    una vez me sucedió algo parecido y lo solucione de esta forma

    • Marcado como respuesta Pacho-B viernes, 26 de septiembre de 2014 14:31
    viernes, 26 de septiembre de 2014 14:02
  • El cliente es una aplicación Escritorio
    • Editado Pacho-B viernes, 26 de septiembre de 2014 14:15 Error en lo que escribi
    viernes, 26 de septiembre de 2014 14:13
  • El cliente es una app de escritorio o web si es de escritorio puedes poner esto en el app.config

    <system.net> <connectionManagement> <clear/> <add address="*" maxconnection="1000" /> </connectionManagement> </system.net>

    una vez me sucedió algo parecido y lo solucione de esta forma

    Muchas Gracias Me funciono correctamente.
    viernes, 26 de septiembre de 2014 14:32
  • Me da gusto debes saber que el asterisco (*) puedes cambiarlo por la dirección del servicio así solo tendrás el maxconnection para esa dirección y no para todas las direcciones que pueda usar tu app
    miércoles, 15 de octubre de 2014 13:07