Dopo la puntata dedicata al lato server passiamo al lato client. Per creare un client abbiamo il service metadata utility tool (svcutil.exe).

Il Service Metadata Utility Tool è simile (concettualmente) al wsdl.exe usato in ASP.NET. Permette di creare servizi dal metadato e viceversa. Per creare la classe proxy del servizio implementato dobbiamo quindi richiamare il tool da riga di comando:

svcutil.exe /uxs /out:ContactServiceProxy.cs /config:app.config http://localhost/ContactService.svc?wsdl

L'opzione /uxs (che vuol dire usa l'Xmlserializer) è necessaria in quanto abbiamo decorato (imposto) il contratto con questo serializzatore. L'opzione /out serve a definire il nome del file prodotto (altrimenti creerebbe un anonimo file tempuri.org.cs). Infine l'opzione /config:app.config server a creare il file di configurazione usato dalla classe proxy.

Avendo generato la classe proxy il tutto diventa una banalità:

Contact contact = new Contact();
contact.FirstName = "Mario";
contact.LastName = "Rossi";
contact.EMail = "
mario.rossi@miasocieta.it";
contact.HomePhoneNumber = "094893478";
contact.MobilePhoneNumber = "87436273";

ContactServiceProxy proxy = new ContactServiceProxy("IContactService");
Console.WriteLine(proxy.SubmitContact(contact));
proxy.Close();

Come si può evicere la chiamata è decisamente simile a quello che facciamo con i web services oggi. L'unica differenza consiste nel fatto che usando un canale creato (ed aperto) dalla ChannelFactory bisogna chiuderlo alla fine (oppure aspettare che ci pensi il GC, ma non è un a bella cosa...vero ?)

Se avessimo voluto scriverci tutto a mano (duri e puri :-D) avremmo docuto creare l'interfaccia del servizio:

[Serializable]
[XmlTypeAttribute(Namespace="
http://peway.com/contact")]
public partial class Contact
{
 public string FirstName;   
 public string LastName;   
 public string EMail;
 public string HomePhoneNumber;   
 public string MobilePhoneNumber;   
}

[ServiceContract(Namespace="http://peway.com/contactmanagement", FormatMode=ContractFormatMode.XmlSerializer)]
public interface IContactService
{
   
 [OperationContract(Action="
http://peway.com/contactmanagement/IContactService/SubmitContact", ReplyAction="http://peway.com/contactmanagement/IContactService/SubmitContactResponse", Style=ServiceOperationStyle.DocumentBare)]
 [return: MessageBody(Name="SubmitContactResult", Namespace="
http://peway.com/contactmanagement")]
 string SubmitContact([System.ServiceModel.MessageBodyAttribute(Namespace="
http://peway.com/contact")] Contact contact);
}

definire il file di configurazione:



 
   
      http://pew-vpcxp/ContactService.svc" bindingConfiguration="IContactService"
        bindingSectionName="customBinding" configurationName="IContactService"
        contractType="IContactService">
        http://pew-vpcxp/ContactService.svc"
          identityData="" identityType="None" isAddressPrivate="False" />
     

   

   
     
       
                      contextMode="Session" defaultProtectionLevel="EncryptAndSign"
            enableKeyDerivation="True" includeTimestamp="True" messageProtectionOrder="SignBeforeEncrypt"
            securityVersion="WSSecurityXXX2005" />
                      maxMessageSize="65536" authenticationScheme="Anonymous" bypassProxyOnLocal="False"
            mapAddressingHeadersToHttpHeaders="False" realm="" transferTimeout="00:10:00"
            useSystemWebProxy="True" />
                      messageVersion="Default" encoding="utf-8" />
       

     

   

 

ed infine invocare il servizio:

ChannelFactory channelFactory = new ChannelFactory("IContactService");
channelFactory.Open();

IContactService channel = channelFactory.CreateChannel();
Console.WriteLine(channel.SubmitContact(contact));

channelFactory.Close();

Alla prossima puntata...