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