Dela via


Exempel på net.TCP-portdelning

I den här artikeln beskrivs exemplet PortSharing.

TCP/IP-protokollet använder ett 16-bitarsnummer, som kallas port, för att skilja anslutningar till flera nätverksprogram som körs på samma dator. Om ett program lyssnar på en port går all TCP-trafik för den porten till det programmet. Andra program kan inte lyssna på den porten samtidigt.

Många protokoll har ett standard- eller standardportnummer som de använder. TILL exempel använder HTTP-protokollet vanligtvis TCP-port 80. Internet Information Services (IIS) har en lyssnare för att dela en port mellan flera HTTP-program. IIS lyssnar direkt på porten och vidarebefordrar meddelanden till rätt program baserat på information i meddelandeströmmen. Detta gör att flera HTTP-program kan använda samma portnummer utan att behöva konkurrera om att reservera porten för att ta emot meddelanden.

NetTcp-portdelning är en WCF-funktion (Windows Communication Foundation) som på samma sätt gör att flera nätverksprogram kan dela en enda port. NetTcp-portdelningstjänsten accepterar anslutningar med net.tcp-protokollet och vidarebefordrar meddelanden baserat på deras måladress.

NetTcp-portdelningstjänsten är inte aktiverad som standard. Innan du kör det här exemplet måste du aktivera tjänsten manuellt. Mer information finns i Så här aktiverar du Net.TCP-portdelningstjänsten. Om tjänsten är inaktiverad utlöses ett undantag när serverprogrammet startas.

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

Portdelning aktiveras på servern genom att ange PortSharingEnabled egenskapen för bindningen NetTcpBinding eller bindningselementet TcpTransportBindingElement . Klienten behöver inte veta hur portdelning har konfigurerats för att använda den på servern.

Aktivera portdelning

Följande kod visar aktivering av portdelning på servern. Den startar en instans av ICalculator tjänsten på en fast port med en slumpmässig URI-sökväg. Även om två tjänster kan dela samma port måste deras övergripande slutpunktsadresser fortfarande vara unika så att NetTcp-portdelningstjänsten kan dirigera meddelanden till rätt program.

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

Med portdelning aktiverat kan du köra tjänsten flera gånger utan att ha en konflikt om portnumret. Om du ändrar koden för att inaktivera portdelning resulterar det i att två kopior av tjänsten startas, vilket resulterar i att den andra misslyckas med en 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

Köra exemplet

Du kan använda testklienten för att kontrollera att meddelanden dirigeras korrekt till tjänster som delar porten.

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

Varje instans av tjänsten skriver ut sitt unika nummer och sin adress. Du kan till exempel se följande text när du kör service.exe.

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

Ange det tjänstnummer du ser här när du kör 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.

Det här exemplet kan köras i en konfiguration mellan datorer genom att ändra den genererade adress som klienten använder. I Client.cs ändrar du formatsträngen för slutpunktsadress så att den matchar den nya adressen för din tjänst. Ersätt alla referenser till "localhost" med IP-adressen för serverdatorn. Du måste kompilera om exemplet när du har gjort den här ändringen.

Så här konfigurerar du, skapar och kör exemplet

  1. Installera ASP.NET 4.0 med hjälp av följande kommando.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  3. Aktivera NetTcp-portdelningstjänsten enligt beskrivningen i introduktionsavsnittet.

  4. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  5. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel. Specifik information för att köra det här exemplet ingår tidigare i avsnittet Kör exemplet.