Per poter comunicare con un servizio Indigo è necessario definire almeno un endpoint. Un endpoint è frutto di tre componenti: EndpointAddress, Binding e ContractDescription. Questi tre elementi rispondono a tre domande: "dove ?", "come ?" e "che cosa ?" rispettivamente.
endpointAddress
Contiene l'identificativo (URI) del luogo dove si trova l'indirizzo. Nel caso fosse un web service potremmo avere lo URI definito come http://mioserver/mioservizio.svc (in Indigo su usa di default *.svc - in ASP.NET *.asmx)
L'endpointAddress può contenere molte più informazioni oltre allo URI in quanto riflette le specifiche dell EPR (EndPointReference) di WS-Addressing. Ad esempio è possibile specificare dove inviare l'eventuale messaggio di risposta (replyTo) che potrebbe essere diverso da quello del chiamante, oppure dove inviare il messaggio di errore (faultTo), ecc. ecc.
Esso può essere definito sia programmaticamente (solitamente nel metodo AddEndpoint dell'Host) che dichiarativamente (nel file di configurazione - web.config se l'host è IIS) nella sezione endpoint.
Binding
Il binding ci fornisce informazioni su come comunicare con il servizio. Ad esempio con quale protocollo di rete (HTTP, TCP, MSMQ, ecc.), quale tipo di codifica (binaria o testuale), quali accorgimenti di sicurezza (SSL, WSS, ecc.), quali il tipo di comunicazione (definizione di timout, reliability, ecc.).
Nella definizione dichiarativa dell'endpoint si definisce (attributo bindingConfiguration) dove sono definite le informazioni di binding. Nel seguente esempio:
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.serviceModel>
<services>
<service
serviceType="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
bindingSectionName="wsProfileBinding"
bindingConfiguration="Binding1"
contractType="Microsoft.ServiceModel.Samples.ICalculator, service" />
</service>
</services>
<bindings>
<wsProfileBinding>
<binding configurationName="Binding1" soapVersion="Soap12" />
</wsProfileBinding>
</bindings>
<behaviors>
<behavior
configurationName="CalculatorServiceBehavior"
returnUnknownExceptionsAsFaults="True">
</behavior>
</behaviors>
</system.serviceModel>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
possiamo vedere che il servizio CalculatorService usa la versione 1.2 delle specifiche SOAP. Le specifiche di binding possono divenire molto complesse (la granularità è molto elevata come si può constatare nel seguente documento http://winfx.msdn.microsoft.com/library/default.asp?url=/library/en-us/indigo_con/html/2c243746-45ce-4588-995e-c17126a579a6.asp) e prossimamente parleremo in modo più ampio dell'argomento.
ContractDescription
E' il contratto (in ASP.NET è definito mediante WSDL). In Indigo ci sono tre tipologie di contratto: service contract, operation contract e data contract. Per fare un paragone (molto approssimativo) con i web services implementati in ASP.NET il service contract è la classe decorata con [WebService], l'operation contract è il metodo decorato con [WebMethod] e il data contract sono i tipi dei parametri del metodo di cui sopra.
Per Indigo, il contract description è l'interfaccia decorata con l'attributo [ServiceContract] pertanto nella definizione (contractType) è sufficiente definirne il full name dell'interfaccia stessa (nell'esempio sopra è "Microsoft.ServiceModel.Samples.ICalculator, service")