Partager via


Exemple de partage de port Net.TCP

Cet article décrit l’exemple PortSharing.

Le protocole TCP/IP utilise un nombre 16 bits, appelé port, pour différencier les connexions à plusieurs applications réseau s’exécutant sur le même ordinateur. Si une application écoute sur un port, tout le trafic TCP de ce port passe à cette application. D’autres applications ne peuvent pas écouter ce port en même temps.

De nombreux protocoles ont un numéro de port standard ou par défaut qu’ils utilisent. Par exemple, le protocole HTTP utilise généralement le port TCP 80. Internet Information Services (IIS) dispose d’un écouteur pour partager un port entre plusieurs applications HTTP. IIS écoute directement le port et transfère les messages à l’application appropriée en fonction des informations contenues dans le flux de messages. Cela permet à plusieurs applications HTTP d’utiliser le même numéro de port sans avoir à concurrencer le port pour recevoir des messages.

Le partage de ports NetTcp est une fonctionnalité Windows Communication Foundation (WCF) qui permet de manière similaire à plusieurs applications réseau de partager un seul port. Le service de partage de ports NetTcp accepte les connexions à l’aide du protocole net.tcp et transfère les messages en fonction de leur adresse de destination.

Le service de partage de ports NetTcp n’est pas activé par défaut. Avant d’exécuter cet exemple, vous devez activer manuellement le service. Pour plus d’informations, consultez Guide pratique pour activer le service de partage de ports Net.TCP. Si le service est désactivé, une exception est levée lorsque l’application serveur est démarrée.

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

Le partage de ports est activé sur le serveur en définissant la PortSharingEnabled propriété de la NetTcpBinding liaison ou l’élément TcpTransportBindingElement de liaison. Le client n’a pas à savoir comment le partage de ports a été configuré pour l’utiliser sur le serveur.

Activation du partage de ports

Le code suivant illustre l’activation du partage de ports sur le serveur. Il démarre une instance du ICalculator service sur un port fixe avec un chemin d’URI aléatoire. Même si deux services peuvent partager le même port, leurs adresses de point de terminaison globales doivent toujours être uniques afin que le service de partage de ports NetTcp puisse acheminer les messages vers l’application correcte.

// 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();

Lorsque le partage de ports est activé, vous pouvez exécuter le service plusieurs fois sans avoir de conflit sur le numéro de port. Si vous modifiez le code pour désactiver le partage de ports, le démarrage de deux copies du service entraîne l’échec de la seconde avec 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

Exécution de l’exemple

Vous pouvez utiliser le client de test pour vérifier que les messages sont correctement routés vers les services partageant le port.

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();
   }
}

Chaque instance du service imprime son numéro et son adresse uniques. Par exemple, vous pouvez voir le texte suivant lorsque vous exécutez service.exe.

Service #4381 listening on net.tcp://localhost:9000/calculator/4381.
Press <ENTER> to terminate service.

Entrez le numéro de service que vous voyez ici lorsque vous exécutez 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.

Cet exemple peut être exécuté dans une configuration inter-ordinateurs en modifiant l’adresse générée utilisée par le client. Dans le Client.cs, modifiez la chaîne de format d’adresse du point de terminaison pour qu’elle corresponde à la nouvelle adresse de votre service. Remplacez toutes les références à « localhost » par l’adresse IP de l’ordinateur serveur. Vous devez recompiler l’exemple après avoir effectué cette modification.

Pour configurer, générer et exécuter l’exemple

  1. Installez ASP.NET 4.0 à l’aide de la commande suivante.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  3. Activez le service de partage de ports NetTcp comme décrit précédemment dans la section introduction.

  4. Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.

  5. Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation. Des détails spécifiques pour l’exécution de cet exemple sont inclus précédemment dans la section Exécution de l’exemple.