¿Es complicado configurar WCF?

WCF nos provee de un bonito esquema XML para poder configurar nuestros servicios y cientes WCF en los archivos app.config o web.config. Una de las cosas que siempre me encuentro cuando enseño a alguien WCF es siempre la respuesta que es demasiado configurable y que al final les causa problemas porque esta configuración ademas de ser extensiva no es nada intuitiva y al ser en formato XML no es nada facil de leer.


En la siguiente imagen os dejo la estructura del esquema


 



Bastante complejo verdad?, y sia demas nos encontramos con que la documentación de WCF es bastante oscura se convierte en un problema. Por ejemplo si accedemos a la documentación del parametro maxNameTableCharCount , nos encontramos con la frase:


 


This quota limits the total number of characters in strings that are atomized in the NameTable for the reader. When strings are atomized they are inserted into a NameTable and never removed. This can cause the buildup of large amounts of character data in a NameTable. This quota places a limit on how much data can be buffered in the reader’s NameTable.

Por lo que la gente al no entender lo que  nos qiere decir siempre dejan los valores por defecto que a veces nos dan errores y no sabemos por donde atacarlos. Es bueno que WCF nos ofrezca una granularidad muy fin en cuanto a la configuración el problema viene cuando no entendemos las multiples opciones que nos proporciona.


 


Cual es vuestra opinion?


Reflection.js

Ahora que esta tan de moda con WPF el refljo de imagenes en nuestras aplicaciones, he encontrado una libreria javascript que nos permite utilizar este recurso en nuestras paginas web. Esta libreria se llama reflection.js y nos permite efectos tan chulos como

 

Service Throttling

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:

  1. Concurrencia máxima de sesiones : numero de sesiones que pueden ser activadas
  2. 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
  3. 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

Comparativa de rendimiento de WCF

Acabo de encontrar una compartiva de Rendimiento entre WCF y las tecnologias anteriores de .NET con respecto a sistemas distribuidos.


podeis echarle un vistazo aqui


Como resumen


 


To summarize the results, WCF is 25%-50% faster than ASP.NET Web Services, and approximately 25% faster than .NET Remoting.
Comparison with .NET Enterprise Service is load dependant, as in one case WCF is nearly 100% faster but in another scenario it is nearly 25% slower.
For WSE 2.0/3.0 implementations, migrating them to WCF will obviously provide the most significant performance gains of almost 4x.