Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive l'esempio PortSharing.
Il protocollo TCP/IP usa un numero a 16 bit, denominato porta, per distinguere le connessioni a più applicazioni di rete in esecuzione nello stesso computer. Se un'applicazione è in ascolto su una porta, tutto il traffico TCP per tale porta passa a tale applicazione. Altre applicazioni non possono ascoltare su quella porta contemporaneamente.
Molti protocolli hanno un numero di porta standard o predefinito che usano. Ad esempio, il protocollo HTTP usa in genere la porta TCP 80. Internet Information Services (IIS) dispone di un listener per condividere una porta tra più applicazioni HTTP. IIS è in ascolto diretto sulla porta e inoltra i messaggi all'applicazione appropriata in base alle informazioni all'interno del flusso di messaggi. Ciò consente a più applicazioni HTTP di usare lo stesso numero di porta senza dover competere per riservare la porta per la ricezione dei messaggi.
NetTcp Port Sharing è una funzionalità di Windows Communication Foundation (WCF) che consente a più applicazioni di rete di condividere una singola porta. Il servizio di condivisione delle porte NetTcp accetta connessioni usando il protocollo net.tcp e inoltra i messaggi in base all'indirizzo di destinazione.
Il servizio di condivisione delle porte NetTcp non è abilitato per impostazione predefinita. Prima di eseguire questo esempio, è necessario abilitare manualmente il servizio. Per altre informazioni, vedere Procedura: Abilitare il servizio di condivisione delle porte Net.TCP. Se il servizio è disabilitato, viene generata un'eccezione all'avvio dell'applicazione server.
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
La condivisione delle porte è abilitata sul server impostando la proprietà PortSharingEnabled dell'elemento di associazione NetTcpBinding o dell'associazione TcpTransportBindingElement. Il client non deve sapere come è stata configurata la condivisione delle porte per usarla nel server.
Abilitazione della condivisione delle porte
Il codice seguente illustra l'abilitazione della condivisione delle porte nel server. Avvia un'istanza del ICalculator servizio su una porta fissa con un percorso URI casuale. Anche se due servizi possono condividere la stessa porta, gli indirizzi degli endpoint complessivi devono comunque essere univoci in modo che il servizio di condivisione delle porte NetTcp possa instradare i messaggi all'applicazione corretta.
// 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();
Con la condivisione delle porte abilitata, è possibile eseguire il servizio più volte senza che si sia verificato un conflitto sul numero di porta. Se si modifica il codice per disabilitare la condivisione delle porte, l'avvio di due copie del servizio porta al fallimento del secondo con 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
Esecuzione dell'esempio
È possibile usare il client di test per verificare che i messaggi vengano indirizzati correttamente ai servizi che condividono la porta.
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();
}
}
Ogni istanza del servizio stampa il proprio numero e indirizzo univoci. Ad esempio, è possibile che venga visualizzato il testo seguente quando si esegue service.exe.
Service #4381 listening on net.tcp://localhost:9000/calculator/4381.
Press <ENTER> to terminate service.
Quando esegui client.exe, inserisci il numero di servizio visualizzato qui.
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.
Questo esempio può essere eseguito in una configurazione tra computer modificando l'indirizzo generato usato dal client. Nella Client.cs modificare la stringa di formato dell'indirizzo dell'endpoint in modo che corrisponda al nuovo indirizzo del servizio. Sostituire tutti i riferimenti a "localhost" con l'indirizzo IP del computer server. È necessario ricompilare l'esempio dopo aver apportato questa modifica.
Per configurare, compilare ed eseguire l'esempio
Installare ASP.NET 4.0 usando il comando seguente.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableAssicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.
Abilitare il servizio di condivisione delle porte NetTcp come descritto in precedenza nella sezione introduttiva.
Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio in una configurazione con computer singolo o incrociato, seguire le istruzioni riportate in Esecuzione degli esempi di Windows Communication Foundation. I dettagli specifici per l'esecuzione di questo esempio sono inclusi in precedenza nella sezione Esecuzione dell'esempio.