Como mi Ingles no es nada bueno, cuando vi por primera vez este termino en WCF, no tenia ni idea de lo que queria decir, peor fue cuando fui a la Wikipedia y vi lo que queria decir «valvula reguladora», asi que fue peor.
Bueno Throttling es una técnica que permite la restricción de clientes de un servicio WCF y nos permite restringir a travès de tres parametros en el fichero de configuración del hosting del servicio. Estos parametros son:
- Concurrencia máxima de sesiones : numero de sesiones que pueden ser activadas
- Concurrencia máxima de llamadas : Este valor representa el numero de mensajes que pueden ser concurrentes para ser procesados por todas las instancias de tu servicio
- Concurrencia máxima de instancias: Este valor represenat el maximo numero de instancias de tu servicio que pueden estar. El numero de instancias dependera del atributo InstanceContextMode
Por defecto esta configurado con los siguientes valores
<behaviors> <serviceBehaviors> <behavior name="DefaultThrottlingBehavior"> <serviceThrottling maxConcurrentCalls="16" maxConcurrentSessions="10" maxConcurrentInstances="<Int32.MaxValue>" /> </behavior> </serviceBehaviors> </behaviors>
Estos valores tambien se pueden asignar por codigo la manera de hacerlo seria:
Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]); using (ServiceHost serviceHost = new ServiceHost(typeof(SampleService), baseAddress)) { try { ServiceThrottlingBehavior throttle = serviceHost.Description.Behaviors.Find<ServiceThrottlingBehavior>(); if (throttle == null) { throttle = new ServiceThrottlingBehavior(); throttle.MaxConcurrentCalls = 1; throttle.MaxConnections = 1; throttle.MaxInstances = 1; throttle.MaxPendingOperations = 1; serviceHost.Description.Behaviors.Add(throttle); } else Console.WriteLine("Ya se ha configurado Service Throrrling."); serviceHost.Open(); Console.WriteLine("El servicio esta OK."); Console.WriteLine("Pulsa Enter para salir."); Console.WriteLine(); Console.ReadLine(); serviceHost.Close(); } catch (TimeoutException timeProblem) { Console.WriteLine("Time Out del servicio. " + timeProblem.Message); } catch (CommunicationException commProblem) { Console.WriteLine("Hay un problema de comunicacion. " + commProblem.Message); } }
Este comportamiento hay que tenerlo bastante en cuenta porque puede conducirnos a errores
muy dificles de descubrir si no lo conocemos
me salvaste la vida!!!!!!!!!!!!!!!!!!!!
funciona de 10!!!!!!
Me alegro haberte ayudado
Hola Oskar.
A mi tambien me salvaste la vida.
Gracias
Muy buena Oskar,
Solucionaste un error que para mi era muy importante, visto que no me permitia enviar mi producto a produccion.
Gracias