Beispiel zur Net.TCP-PortfreigabeNet.TCP Port Sharing Sample

Im TCP/IP-Protokoll wird mithilfe einer 16-stelligen Zahl (als Port bezeichnet) zwischen Verbindungen mit mehreren Netzwerkanwendungen unterschieden, die auf demselben Computer ausgeführt werden.The TCP/IP protocol uses a 16-bit number, called a port, to differentiate connections to multiple network applications running on the same machine. Wenn eine Anwendung einen Port überwacht, wird der gesamte TCP-Verkehr für diesen Port an die entsprechende Anwendung geleitet.If an application is listening on a port, then all TCP traffic for that port goes to that application. Andere Anwendungen können nicht gleichzeitig an diesem Port lauschen.Other applications cannot listen on that port at the same time.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Binding\Net\TCP\PortSharing

Viele Protokolle verwenden eine Standardportnummer.Many protocols have a standard or default port number that they use. Das HTTP-Protokoll verwendet beispielsweise in der Regel TCP-Port 80.For example, the HTTP protocol typically uses TCP port 80. Internetinformationsdienste (IIS) verfügen über einen Listener, damit mehrere HTTP-Anwendungen gemeinsam einen Port verwenden können.Internet Information Services (IIS) has a listener to share a port between multiple HTTP applications. IIS überwacht den Port direkt und leitet Nachrichten an die entsprechende Anwendung weiter. Dies erfolgt auf Grundlage von Informationen im Nachrichtenstream.IIS listens on the port directly and forwards messages to the appropriate application based on information inside the message stream. So können mehrere HTTP-Anwendungen die gleiche Portnummer verwenden, ohne um das Reservieren des Ports für den Nachrichteneingang konkurrieren zu müssen.This allows multiple HTTP applications to use the same port number without having to compete to reserve the port for receiving messages.

NetTcp-Portfreigabe ist eine Windows Communication Foundation (WCF)-Funktion, die auf ähnliche Weise mehrere netzwerkanwendungen einen einzelnen Port freigeben kann.NetTcp Port Sharing is a Windows Communication Foundation (WCF)feature that similarly allows multiple network applications to share a single port. Der NetTcp-Portfreigabedienst nimmt Verbindungen mithilfe des net.tcp-Protokolls an und leitet Nachrichten auf Grundlage ihrer Zieladresse weiter.The NetTcp Port Sharing Service accepts connections using the net.tcp protocol and forwards messages based on their destination address.

Der NetTcp-Portfreigabedienst ist standardmäßig nicht aktiviert.The NetTcp Port Sharing Service is not enabled by default. Vor dem Ausführen dieses Beispiels müssen Sie den Dienst manuell aktivieren.Before running this sample, you must manually enable the service. Weitere Informationen finden Sie unter Vorgehensweise: Aktivieren Sie den Net.TCP-Portfreigabedienst.For more information, see How to: Enable the Net.TCP Port Sharing Service. Wenn der Dienst deaktiviert ist, wird beim Starten der Serveranwendung eine Ausnahme ausgelöst.If the service is disabled, an exception is thrown when the server application is started.

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  

Die Portfreigabe wird auf dem Server aktiviert, indem die PortSharingEnabled-Eigenschaft der NetTcpBinding-Bindung oder des TcpTransportBindingElement-Bindungselements festgelegt wird.Port sharing is enabled on the server by setting the PortSharingEnabled property of the NetTcpBinding binding or the TcpTransportBindingElement binding element. Der Client muss nicht wissen, wie die Portfreigabe konfiguriert wurde, um sie auf dem Server zu verwenden.The client does not have to know how port sharing has been configured to use it on the server.

Aktivieren der PortfreigabeEnabling Port Sharing

Im folgenden Code wird das Aktivieren der Portfreigabe auf dem Server veranschaulicht.The following code demonstrates enabling port sharing on the server. Es wird eine Instanz des ICalculator-Diensts auf einem festen Port mit einem zufälligen URI-Pfad gestartet.It starts an instance of the ICalculator service on a fixed port with a random URI path. Zwei Dienste können zwar denselben Port verwenden, ihre allgemeinen Endpunktadressen müssen jedoch eindeutig sein, damit der NetTcp-Portfreigabedienst Nachrichten an die richtige Anwendung weiterleiten kann.Even though two services can share the same port, their overall endpoint addresses still must be unique so that the NetTcp Port Sharing Service can route messages to the correct application.

// 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 =  
   String.Format("net.tcp://localhost:9000/calculator/{0}", salt);  
host.AddServiceEndpoint(typeof(ICalculator), binding, address);  
host.Open();  

Wenn die Portfreigabe aktiviert ist, können Sie den Dienst mehrmals ausführen, ohne dass es zu einem Konflikt aufgrund der Portnummer kommt.With port sharing enabled, you can run the service multiple times without having a conflict over the port number. Wenn Sie den Code ändern, um die Portfreigabe zu deaktivieren, führt das Starten zweier Kopien des Diensts bei der zweiten Kopie zu einem Fehler mit einer AddressAlreadyInUseException.If you change the code to disable port sharing, starting up two copies of the service results in the second failing with an 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  

Ausführen des BeispielsRunning the Sample

Sie können mithilfe des Testclients überprüfen, ob Nachrichten richtig an die Dienste weitergeleitet werden, die den Port gemeinsam verwenden.You can use the test client to check that messages are correctly routed to services sharing the port.

class client  
{  
   static void Main(string[] args)  
   {  
      Console.Write("Enter the service number to test: ");  
      ushort salt = ushort.Parse(Console.ReadLine());  
      string address = String.Format("net.tcp://localhost:9000/calculator/{0}", 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();  
   }  
}  

Jede Instanz des Diensts gibt ihre eindeutige Nummer und Adresse aus.Each instance of the service prints out its unique number and address. Wenn Sie service.exe ausführen, kann beispielsweise der folgende Text angezeigt werden:For instance, you may see the following text when you run service.exe.

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

Geben Sie beim Ausführen von client.exe die hier angegebene Dienstnummer ein.Enter the service number you see here when you run 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.  

Dieses Beispiel kann in einer Konfiguration mit mehreren Computern ausgeführt werden, indem Sie die vom Client verwendete generierte Adresse ändern.This sample can be run in a cross-machine configuration by changing the generated address that the client uses. Ändern Sie in Client.cs die Formatzeichenfolge für die Endpunktadresse, sodass sie mit der neuen Adresse Ihres Diensts übereinstimmt.In the Client.cs, change the endpoint address format string to match the new address of your service. Ersetzen Sie alle Verweise auf "localhost" durch die IP-Adresse des Servercomputers.Replace any references to "localhost" with the IP address of the server machine. Sie müssen das Beispiel neu kompilieren, nachdem Sie diese Änderung vorgenommen haben.You must recompile the sample after making this change.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Installieren Sie ASP.NETASP.NET 4.0 mithilfe des folgenden Befehls.Install ASP.NETASP.NET 4.0 using the following command.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable  
    
  2. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  3. Aktivieren Sie den NetTcp-Portfreigabedienst wie im Einführungsabschnitt oben beschrieben.Enable the NetTcp Port Sharing Service as previously described in the introduction section.

  4. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  5. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples. Detaillierte Informationen zum Ausführen finden Sie oben im Abschnitt zum Ausführen des Beispiels.Specific details for running this sample are included previously in the Running the Sample section.

Siehe auchSee Also