Ir al contenido principal

Pruebas de desempeño - WCF - netTcpBinding

Para esta ultima prueba, modificamos la aplicacion principal para que funcione como cliente del servicio de suma, e incluimos dos nuevos proyectos. Uno de ellos para el host del servicio de suma basado en Windows Communication Foundation, y otro para el contrato (un assembly que solo contenga las interfaces publicas a utilizar).

Los cambios en la aplicacion principal son:

En el archivo de configuracion (app.config):



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="SinSeguridad">
<security mode="None">
<message clientCredentialType="None" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8080/SumadorWCF/ServicioSuma"
binding="netTcpBinding" bindingConfiguration="SinSeguridad"
contract="SumadorWCF.Contratos.IServicio" name="Sumador" />
</client>
</system.serviceModel>
</configuration>


y en el codigo principal:



using System;
using System.Collections.Generic;
using System.Configuration; // Agregar referencia System.Configuration 2.0
using System.IO;
using System.Text;
using System.Threading;
using System.Reflection;
using System.ServiceModel;
using SumadorWCF.Contratos;

namespace Tester
{
class Program
{
private static bool iterar = true;
static void Main(string[] args)
{
int duracion = 1000;

Console.Write("Nombre de la prueba:");
string nombre = Console.ReadLine();

Console.WriteLine();
Console.WriteLine("Presione una tecla para iniciar la prueba");
Console.ReadKey();

Console.WriteLine("Finalizar prueba cada {0} milisegundos",duracion);
try
{
ChannelFactory<IServicio> channel = new ChannelFactory<IServicio>("Sumador");
IServicio servicio = channel.CreateChannel();

short i = 0;
using(StreamWriter sw = File.AppendText(string.Format("{0}.txt",nombre.Replace(' ','_'))))
{
while(i++ < 10)
{
ParameterizedThreadStart thsFinalizaStress = new ParameterizedThreadStart(Program.finalizarStressEn);
Thread th = new Thread(thsFinalizaStress);
iterar = true;

th.Start(duracion);

long contador = 0;
DateTime inicio = DateTime.Now;
TimeSpan tiempo;

while(Program.iterar)
{
contador = servicio.sumar(contador);
}
tiempo = DateTime.Now - inicio;

Console.WriteLine("El contador alcanzo {0:N} en {1:N} milisegundos",contador,tiempo.TotalMilliseconds);
sw.WriteLine("{0}_{1}\t{2:N}\t{3:N}",nombre,i,contador,tiempo.TotalMilliseconds);
}
}
Console.WriteLine();
channel.Close();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("Presione una tecla para finalizar");
Console.ReadKey();


}
static void finalizarStressEn(object iMillisecondsTimeout)
{
int millisecondsTimeout = (int)iMillisecondsTimeout;
Thread.Sleep(millisecondsTimeout);
Program.iterar = false;
}
}
}




Contratos

Incluimos un nuevo proyecto de tipo libreria, borramos los archivos autogenerados e incluimos la siguiente interfaz:



using System;
using System.ServiceModel;

namespace SumadorWCF.Contratos
{
[ServiceContract()]
public interface IServicio
{
[OperationContract]
long sumar(long n);
}
}


El servidor o host, del servicio de suma.

Agregamos un proyecto de tipo consola a la solucion. En el agregamos la referencia al namespace System.ServiceModel y al proyecto que contiene los contratos. El codigo de la aplicacion es el siguiente:



using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using SumadorWCF;

namespace HostServicioSumador
{
class Program
{
static void Main(string[] args)
{
Console.Write("Iniciando servicio de suma...........");
try
{
ServicioSumador.StartService();
Console.WriteLine("Iniciado.");
Console.WriteLine("\nPresione una tecla para finalizar el servicio.");
Console.ReadKey();
Console.Write("Finalizando servicio de suma...........");
ServicioSumador.StopService();
Console.WriteLine("Finalizado.");
}
catch (Exception ex)
{
Console.WriteLine("\t{0}.",ex.Message);
}
finally
{
Console.WriteLine("\nPresione una tecla para finalizar la aplicacion.");
Console.ReadKey();
}
}
}
internal class ServicioSumador
{
internal static ServiceHost myServiceHost = null;

internal static void StartService()
{
myServiceHost = new ServiceHost(typeof(SumadorWCF.Servicio));
myServiceHost.Open();
}

internal static void StopService()
{
if (myServiceHost.State != CommunicationState.Closed)
myServiceHost.Close();
}
}
}


Como hasta ahora, el mismo codigo para efectuar la suma, pero ahora como una implementacion de la interfaz que define el contrato:



using System;

namespace SumadorWCF
{
public class Servicio : Contratos.IServicio
{
public long sumar(long n)
{
return ++n;
}
}
}


Tambien, incluimos un archivo de configuracion (app.config) y en el:



<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="SinSeguridad">
<security mode="None">
<message clientCredentialType="None" />
</security>
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="SumadorWCF.Servicio">
<endpoint address="net.tcp://localhost:8080/SumadorWCF/ServicioSuma"
binding="netTcpBinding" bindingConfiguration="SinSeguridad" name="Sumador"
contract="SumadorWCF.Contratos.IServicio" />
</service>
</services>
</system.serviceModel>
</configuration>

Comentarios

Entradas más populares de este blog

[links] Links para descargas de Visual Studio 2008 SP1, Framework .NET 3.5, su SP1 y Sql Server Express 2008

En el proceso de modernizacion de los entornos de desarrollo que comunmente uso para trabajar, acumule estos links de descargas, que paso a compartir para ahorarle la busqueda a algun colega:

Microsoft .NET Framework 3.5 [web] 197.12 MB

Requerimientos:Windows Server 2003Windows Server 2008Windows VistaWindows XP256 MB de RAM500 MB de espacio disponible en disco



Microsoft .NET Framework 3.5 Service Pack 1 [web] 231.5 MB

Requerimientos:Windows Server 2003Windows Server 2008Windows VistaWindows XP256 MB de RAM500 MB de espacio disponible en disco



Windows Installer 4.5 Redistributable - Español [Windows Server 2003] [web] 3.2 MB

Requerimientos:Windows Server 2003 Service Pack 1Windows Server 2008Windows VistaWindows XP Service Pack 2



Microsoft Visual Studio 2008 Service Pack 1 (iso) [web] 913.79 MB

Requerimientos:Windows Server 2003Windows Server 2008Windows VistaWindows XP1024 MB de RAM



Microsoft SQL Server 2008 Express [web] 99.2 MB

Requerimientos:Windows Server 2003 Service Pack 2Windows Server …

Pruebas de desempeño - XML Webservices

En esta oportunidad, el desacoplamiento al que llegamos nos permite traspasar las barreras de la organizacion. Nuestro servicio de suma, ahora lo proporciona un Werbservices. Por lo tanto, podria estar fuera nuestra bateria de servidores, y la aplicacion funcionaria igual. Por lo menos en resultado, no en prestaciones.
Los cambios:

Agregamos en Web services al proyecto, con este codigo en el ASMX.



using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publicclass Servicio : System.Web.Services.WebService
{

public Servicio(){}

[WebMethod]
publiclong sumar(long n)
{
return ++n;
}

}

Incluimos la referencia WEB a nuestro WS, y estos cambios en la aplicacion.



using System;
using System.Collections.Generic;
using System.Configuration; // Agregar referencia System.Configuration 2.0
using System.IO;
using System.Text;
using System.Th…

Editando DTS de MS SQL 2000 en SQL Server 2005

Con MS-SQL 2005 y su consola de administración Microsoft SQL Server Management Studio, nuestros DTS, que tan bien funcionaban en MS-SQL 2000 y su consola, perdieron un poco de terreno.

Por diferentes razones, hasta que no llego una necesidad real de crear o editar DTS en SQL Management Studio, utilizábamos el cliente del SQL 2000 para ello. Bien, llego esa necesidad y vamos a instalar lo necesario para que con SQLMS pueda editarlos. Lo necesario, por ahora es solo esto:

Descargar este archivo para su versión en español o este para la versión en ingles.

La instalación, incluso con el Management Studio abierto y la lista de DTS visibles, es simple:
Doble click en el archivo descargado, un par se siguientes y un finalizar.