Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describe el ejemplo PortSharing.
El protocolo TCP/IP usa un número de 16 bits, denominado puerto, para diferenciar las conexiones a varias aplicaciones de red que se ejecutan en la misma máquina. Si una aplicación escucha en un puerto, todo el tráfico TCP de ese puerto va a esa aplicación. Otras aplicaciones no pueden escuchar en ese puerto al mismo tiempo.
Muchos protocolos tienen un número de puerto estándar o predeterminado que usan. Por ejemplo, el protocolo HTTP normalmente usa el puerto TCP 80. Internet Information Services (IIS) tiene un agente de escucha para compartir un puerto entre varias aplicaciones HTTP. IIS escucha directamente en el puerto y reenvía los mensajes a la aplicación adecuada en función de la información dentro del flujo de mensajes. Esto permite que varias aplicaciones HTTP usen el mismo número de puerto sin tener que competir para reservar el puerto para recibir mensajes.
El uso compartido de puertos de NetTcp es una característica de Windows Communication Foundation (WCF) que permite de forma similar que varias aplicaciones de red compartan un único puerto. El servicio de uso compartido de puertos netTcp acepta conexiones mediante el protocolo net.tcp y reenvía los mensajes en función de su dirección de destino.
El servicio de uso compartido de puertos netTcp no está habilitado de forma predeterminada. Antes de ejecutar este ejemplo, debe habilitar manualmente el servicio. Para obtener más información, vea Cómo: Habilitar el servicio de uso compartido de puertos Net.TCP. Si el servicio está deshabilitado, se produce una excepción cuando se inicia la aplicación de servidor.
Unhandled Exception: System.ServiceModel.CommunicationException: The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: failed to start the service because it is disabled. An administrator can enable it by running 'sc.exe config NetTcpPortSharing start= demand'.. ---> System.InvalidOperationException: Cannot start service NetTcpPortSharing on computer '.'. ---> System.ComponentModel.Win32Exception: The service cannot be started, either because it is disabled or because it has no enabled devices associated with it
El uso compartido del puerto se habilita en el servidor estableciendo la propiedad PortSharingEnabled del enlace NetTcpBinding o el elemento de enlace TcpTransportBindingElement. El cliente no tiene que saber cómo se ha configurado el uso compartido de puertos para usarlo en el servidor.
Habilitación del uso compartido de puertos
En el código siguiente se muestra cómo habilitar el uso compartido de puertos en el servidor. Inicia una instancia del ICalculator
servicio en un puerto fijo con una ruta de acceso de URI aleatoria. Aunque dos servicios pueden compartir el mismo puerto, sus direcciones de punto de conexión generales siguen siendo únicas para que el servicio de uso compartido de puertos de NetTcp pueda enrutar los mensajes a la aplicación correcta.
// Configure a binding with TCP port sharing enabled
NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;
// Start a service on a fixed TCP port
ServiceHost host = new ServiceHost(typeof(CalculatorService));
ushort salt = (ushort)new Random().Next();
string address = $"net.tcp://localhost:9000/calculator/{salt}";
host.AddServiceEndpoint(typeof(ICalculator), binding, address);
host.Open();
Con el uso compartido de puertos habilitado, puede ejecutar el servicio varias veces sin tener un conflicto sobre el número de puerto. Si cambia el código para deshabilitar el uso compartido de puertos, al iniciar dos copias del servicio, la segunda fallará con un AddressAlreadyInUseException.
Unhandled Exception: System.ServiceModel.AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:9000. Make sure that you are not trying to use this endpoint multiple times in your application and that there are no other applications listening on this endpoint. ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted
Ejecución del ejemplo
Puede usar el cliente de prueba para comprobar que los mensajes se enrutan correctamente a los servicios que comparten el puerto.
class client
{
static void Main(string[] args)
{
Console.Write("Enter the service number to test: ");
ushort salt = ushort.Parse(Console.ReadLine());
string address = $"net.tcp://localhost:9000/calculator/{salt}";
ChannelFactory<ICalculator> factory = new ChannelFactory<ICalculator>(new NetTcpBinding());
ICalculator proxy = factory.CreateChannel(new EndpointAddress(address));
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = proxy.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = proxy.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = proxy.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
// Call the Divide service operation.
value1 = 22.00D;
value2 = 7.00D;
result = proxy.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
factory.Close();
}
}
Cada instancia del servicio imprime su número y dirección únicos. Por ejemplo, puede ver el texto siguiente al ejecutar service.exe.
Service #4381 listening on net.tcp://localhost:9000/calculator/4381.
Press <ENTER> to terminate service.
Escriba el número de servicio que verá aquí al ejecutar client.exe.
Enter the service number to test: 4381
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
Este ejemplo se puede ejecutar en una configuración entre máquinas cambiando la dirección generada que usa el cliente. En el Client.cs, cambie la cadena de formato de dirección del punto de conexión para que coincida con la nueva dirección del servicio. Reemplace las referencias a "localhost" por la dirección IP de la máquina del servidor. Debe volver a compilar el ejemplo después de realizar este cambio.
Para configurar, compilar y ejecutar el ejemplo
Instale ASP.NET 4.0 con el comando siguiente.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Habilite el servicio de uso compartido de puertos de NetTcp como se ha descrito anteriormente en la sección introducción.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation. Los detalles específicos para ejecutar este ejemplo se incluyen anteriormente en la sección Ejecución del ejemplo.