Quando usiamo i tools wsdl.exe (per i web services in ASP.NET) e/o svcutil.exe (per i servizi Indigo) vuol dire che abbiamo l'intenzione, in linea generale, di generare il codice client di un web service. Se avete l'esigenza che sia la vostra applicazione a generare quel codice, allora poco male, è sufficiente richiamare le stessa classi che i due tools di cui sopra richiamano.
In particolare, per generare il codice del contratto, è sufficiente scrivere il seguente codice:
MetadataResolver resolver = new MetadataResolver(new EndpointAddress(uri));
ServiceEndpointCollection endpoints = resolver.RetrieveEndpointsUsingHttpGet();
ServiceContractGenerator generator = new ServiceContractGenerator();
Collection<ContractDescription> contracts = resolver.WsdlImporter.ImportAllContracts();
foreach (ContractDescription contract in contracts)
{
generator.GenerateServiceContractType(contract);
}
using (StreamWriter writer = new StreamWriter(File.Create("Contracts.cs")))
{
new Microsoft.CSharp.CSharpCodeProvider().GenerateCodeFromCompileUnit(
generator.TargetCompileUnit, writer,
new System.CodeDom.Compiler.CodeGeneratorOptions());
}
Il MetadataResolver si occupa di leggere dal servizio (per ora è supportato solamente il protocollo HTTP) il metadato che non è altro che l'insieme di WSDL, XML schema e policies.Il ServiceContractGenerator estrapola tutti i contratti che verranno poi generati dal code dom.