Voorbeeld van delen van Net.TCP-poort
In dit artikel wordt het PortSharing-voorbeeld beschreven.
Het TCP/IP-protocol maakt gebruik van een 16-bits nummer, een poort genoemd, om verbindingen te onderscheiden van meerdere netwerktoepassingen die op dezelfde computer worden uitgevoerd. Als een toepassing luistert op een poort, gaat al het TCP-verkeer voor die poort naar die toepassing. Andere toepassingen kunnen niet tegelijkertijd op die poort luisteren.
Veel protocollen hebben een standaardpoortnummer of standaardpoortnummer dat ze gebruiken. Het HTTP-protocol gebruikt bijvoorbeeld doorgaans TCP-poort 80. Internet Information Services (IIS) heeft een listener om een poort te delen tussen meerdere HTTP-toepassingen. IIS luistert rechtstreeks naar de poort en stuurt berichten door naar de juiste toepassing op basis van informatie in de berichtenstroom. Hierdoor kunnen meerdere HTTP-toepassingen hetzelfde poortnummer gebruiken zonder dat ze de poort hoeven te reserveren voor het ontvangen van berichten.
NetTcp Port Sharing is een WCF-functie (Windows Communication Foundation) waarmee meerdere netwerktoepassingen één poort kunnen delen. De NetTcp Port Sharing Service accepteert verbindingen met behulp van het net.tcp-protocol en stuurt berichten door op basis van hun doeladres.
De NetTcp Port Sharing-service is niet standaard ingeschakeld. Voordat u dit voorbeeld uitvoert, moet u de service handmatig inschakelen. Zie Procedure voor meer informatie: De Net.TCP-poort delen-service inschakelen. Als de service is uitgeschakeld, wordt er een uitzondering gegenereerd wanneer de servertoepassing wordt gestart.
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
Delen van poorten is ingeschakeld op de server door de eigenschap van de PortSharingEnabledNetTcpBinding binding of het TcpTransportBindingElement bindingselement in te stellen. De client hoeft niet te weten hoe het delen van poorten is geconfigureerd voor gebruik op de server.
Poort delen inschakelen
De volgende code demonstreert het inschakelen van poortdeling op de server. Er wordt een exemplaar van de ICalculator
service gestart op een vaste poort met een willekeurig URI-pad. Hoewel twee services dezelfde poort kunnen delen, moeten hun algemene eindpuntadressen nog steeds uniek zijn, zodat de NetTcp Port Sharing Service berichten naar de juiste toepassing kan routeren.
// 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();
Als het delen van poorten is ingeschakeld, kunt u de service meerdere keren uitvoeren zonder dat er een conflict is met het poortnummer. Als u de code wijzigt om het delen van poorten uit te schakelen, resulteert het starten van twee kopieën van de service in de tweede fout met een 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
Het voorbeeld uitvoeren
U kunt de testclient gebruiken om te controleren of berichten correct worden doorgestuurd naar services die de poort delen.
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();
}
}
Elk exemplaar van de service drukt het unieke nummer en het unieke adres af. U ziet bijvoorbeeld mogelijk de volgende tekst wanneer u service.exe uitvoert.
Service #4381 listening on net.tcp://localhost:9000/calculator/4381.
Press <ENTER> to terminate service.
Voer het servicenummer in dat u hier ziet wanneer u client.exe uitvoert.
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.
Dit voorbeeld kan worden uitgevoerd in een configuratie voor meerdere computers door het gegenereerde adres te wijzigen dat door de client wordt gebruikt. Wijzig in de Client.cs de tekenreeks voor de indeling van het eindpuntadres zodat deze overeenkomt met het nieuwe adres van uw service. Vervang eventuele verwijzingen naar 'localhost' door het IP-adres van de servercomputer. U moet het voorbeeld opnieuw compileren nadat u deze wijziging hebt aangebracht.
Het voorbeeld instellen, compileren en uitvoeren
Installeer ASP.NET 4.0 met de volgende opdracht.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Schakel de NetTcp Port Sharing Service in zoals eerder beschreven in de inleidingssectie.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden. Specifieke details voor het uitvoeren van dit voorbeeld zijn eerder opgenomen in de sectie Voorbeeld uitvoeren.