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...