Utilizzo del canale client di individuazione
In fase di scrittura di un'applicazione client WCF è necessario conoscere l'indirizzo endpoint del servizio che si sta chiamando. In molti casi l'indirizzo endpoint di un servizio non è noto in anticipo o l'indirizzo del servizio cambia con il tempo. Il canale client di individuazione consente di scrivere un'applicazione client WCF, descrivere il servizio che si desidera chiamare e il canale client invia automaticamente una richiesta del probe. Quando un servizio risponde, il canale client di individuazione recupera l'indirizzo endpoint per il servizio dalla risposta del probe e lo utilizza per chiamare il servizio.
Utilizzo del canale client di individuazione
Per utilizzare il canale client di individuazione, aggiungere un'istanza di DiscoveryClientBindingElement allo stack del canale client. È in alternativa possibile utilizzare DynamicEndpoint e un DiscoveryClientBindingElement verrà aggiunto in modo automatico all'associazione, se non è già presente.
Attenzione
È consigliabile rendere DiscoveryClientBindingElement l'elemento in primo piano sullo stack del canale client. Qualsiasi elemento di associazione aggiunto in cima a DiscoveryClientBindingElement deve verificare che ChannelFactory o il canale creato non utilizzi l'indirizzo endpoint o Via
(passato al metodo CreateChannel
), poiché potrebbero non contenere l'indirizzo corretto.
La classe DiscoveryClientBindingElement contiene due proprietà pubbliche:
FindCriteria, utilizzata per descrivere il servizio che si desidera chiamare.
DiscoveryEndpointProvider che specifica l'endpoint di individuazione a cui inviare i messaggi di individuazione.
La proprietà FindCriteria consente di specificare il contratto di servizio cercato, qualsiasi URI di ambito obbligatorio e il numero massimo di tentativi di aprire il canale. Il tipo di contratto viene specificato chiamando il costruttore FindCriteria. È possibile aggiungere gli URI di ambito alla proprietà Scopes. La proprietà MaxResults consente di specificare il numero massimo di risultati a cui il client tenta di connettersi. Se viene ricevuta una risposta del probe, il client tenta di aprire il canale utilizzando l'indirizzo endpoint dalla risposta del probe. Se si verifica un'eccezione, il client passa alla risposta del probe successivo, in attesa di ricezione di più risposte, se necessario. Questo schema continua finché il canale non viene aperto o viene raggiunto il numero massimo di risultati. Per altre informazioni su queste impostazioni, vedere FindCriteria.
La proprietà DiscoveryEndpointProvider consente di specificare l'endpoint di individuazione da utilizzare. In genere si tratta di un UdpDiscoveryEndpoint, ma può essere rappresentato da qualsiasi endpoint valido.
In fase di creazione dell'associazione da utilizzare per comunicare con il servizio, è necessario utilizzare la stessa associazione del servizio. L'unica differenza consiste nel fatto che l'associazione client dispone di un DiscoveryClientBindingElement in cima allo stack. Se il servizio utilizza una delle associazioni fornite dal sistema, creare un nuovo elemento CustomBinding e passare all'associazione fornita dal sistema al costruttore CustomBinding. Sarà quindi possibile aggiungere DiscoveryClientBindingElement chiamando Insert
sulla proprietà Elements.
Una volta aggiunto l'elemento DiscoveryClientBindingElement all'associazione e dopo averne eseguito la configurazione, è possibile creare un'istanza della classe client WCF, aprirla e chiamare i relativi metodi. Nell'esempio seguente viene utilizzato il canale client di individuazione per individuare un servizio WCF che implementa la classe ICalculator
(utilizzata nell'esercitazione WCF della Guida introduttiva) e chiama il relativo metodo Add
.
// Create the DiscoveryClientBindingElement
DiscoveryClientBindingElement bindingElement = new DiscoveryClientBindingElement();
// Search for a service that implements the ICalculator interface, attempting to open
// the channel a maximum of 2 times
bindingElement.FindCriteria = new FindCriteria(typeof(ICalculator)) { MaxResults = 2 };
// Use the UdpDiscoveryEndpoint
bindingElement.DiscoveryEndpoint = new UdpDiscoveryEndpoint();
// The service uses the BasicHttpBinding, so use that and insert the DiscoveryClientBindingElement at the
// top of the stack
CustomBinding binding = new CustomBinding(new BasicHttpBinding());
binding.Elements.Insert(0,bindingElement);
try
{
// Create the WCF client and call a method
CalculatorClient client = new CalculatorClient(binding, new EndpointAddress("http://schemas.microsoft.com/dynamic"));
client.Open();
client.Add(1, 1);
}
catch (EndpointNotFoundException ex)
{
Console.WriteLine("An exception occurred: " + ex.Message);
}
Sicurezza e canale client di individuazione
In caso di utilizzo del canale client di individuazione, vengono specificati due endpoint. Uno viene utilizzato per messaggi di individuazione, in genere UdpDiscoveryEndpoint, e l'altro è l'endpoint dell'applicazione. In caso di implementazione di un servizio protetto, è necessario proteggere entrambi gli endpoint. Per altre informazioni sulla sicurezza, vedere Protezione dei servizi e dei client.