Sdílet prostřednictvím


Ukázka služby Net.TCP Port Sharing

Tento článek popisuje ukázku sdílení portů.

Protokol TCP/IP používá 16bitové číslo, označované jako port, k rozlišení připojení k více síťovým aplikacím běžícím na stejném počítači. Pokud aplikace naslouchá na portu, veškerý provoz TCP pro tento port přejde do této aplikace. Ostatní aplikace nemůžou na daném portu současně naslouchat.

Mnoho protokolů má standardní nebo výchozí číslo portu, které používají. Například protokol HTTP obvykle používá port TCP 80. Internetová informační služba (IIS) má naslouchací proces pro sdílení portu mezi více aplikacemi HTTP. Služba IIS naslouchá na portu přímo a předává zprávy příslušné aplikaci na základě informací uvnitř datového proudu zpráv. To umožňuje více aplikacím HTTP používat stejné číslo portu, aniž by museli soutěžit o rezervaci portu pro příjem zpráv.

Sdílení portů NetTcp je funkce WCF (Windows Communication Foundation), která podobně umožňuje více síťovým aplikacím sdílet jeden port. Služba sdílení portů NetTcp přijímá připojení pomocí protokolu net.tcp a předává zprávy na základě jejich cílové adresy.

Služba sdílení portů NetTcp není ve výchozím nastavení povolená. Před spuštěním této ukázky je nutné službu povolit ručně. Další informace naleznete v tématu Postupy: Povolení služby sdílení portů Net.TCP. Pokud je služba zakázaná, při spuštění serverové aplikace se vyvolá výjimka.

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

Sdílení portů je na serveru povoleno nastavením PortSharingEnabled vlastnosti NetTcpBinding vazby nebo elementu vazby TcpTransportBindingElement . Klient nemusí vědět, jak je sdílení portů nakonfigurované tak, aby ho používalo na serveru.

Povolení sdílení portů

Následující kód ukazuje povolení sdílení portů na serveru. Spustí instanci ICalculator služby na pevném portu s náhodnou cestou URI. I když dvě služby můžou sdílet stejný port, jejich celkové adresy koncových bodů musí být stále jedinečné, aby služba sdílení portů NetTcp mohl směrovat zprávy do správné aplikace.

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

Při povoleném sdílení portů můžete službu spustit několikrát, aniž byste museli mít konflikt s číslem portu. Pokud změníte kód tak, aby zakázal sdílení portů, spuštěním dvou kopií služby dojde k selhání sekundy s chybou 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

Spuštění ukázky

Pomocí testovacího klienta můžete zkontrolovat, jestli jsou zprávy správně směrované na služby sdílející 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();
   }
}

Každá instance služby vytiskne své jedinečné číslo a adresu. Při spuštění service.exe se například může zobrazit následující text.

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

Zadejte číslo služby, které se tady zobrazí při spuštění 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.

Tuto ukázku je možné spustit v konfiguraci mezi počítači změnou vygenerované adresy, kterou klient používá. V Client.cs změňte řetězec formátu adresy koncového bodu tak, aby odpovídal nové adrese vaší služby. Nahraďte všechny odkazy na localhost IP adresou počítače serveru. Po provedení této změny je nutné ukázku znovu zkompilovat.

Nastavení, sestavení a spuštění ukázky

  1. Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  3. Povolte službu sdílení portů NetTcp, jak je popsáno v úvodní části.

  4. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

  5. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation. Konkrétní podrobnosti pro spuštění této ukázky jsou zahrnuty dříve v části Spuštění ukázky.