Consumare dinamicamente un Web Service
Cos'è un Web Service?
Un web service non è altro che un'applicazione a cui si può accedere attraverso il web. La caratteristica fondamentale del web service è la sua interfaccia verso la rete. Questa interfaccia deve seguire alcuni standard, per permettere di essere cosumata da qualunque applicazione voglia far uso di essa.
Questa interfaccia standard è permessa grazie all'uso di un linguaggio XML per il passaggio dei messaggi, dal protocollo HTTP e da un documento WSDL (Web Services Description Language ) che descrive l'interfaccia del nostro web service.
A cosa serve il WSDL?
Il documento WSDL permette alle applicazioni che vogliono consumare il servizio di sapere quali siano i metodi e le proprietà esposte dal servizio, il come accedere ad essi e tutti questi dati sono descritti un modo astratto e quindi collegati ad uno specifico protocollo di rete e ad uno specifico formato.
Consumare un Web Service in modo classico
Per poter consumare un web service da un'applicazione, è sufficiente scegliere di aggiungere una web reference e quindi digitare l'URL dove si trova il servizio e quindi aggiungerlo. A questo punto l'ambiente di Visual Studio si occuperà di interrogare il file .wsdl (contenente la descrizione del servizio che vogliamo consumare) e genererà in modo automatico una classe che ci conterrà tutti i metodi e le proprietà per poter interrogare il web service sia in modalità sincrona cha aincrona.
Questo però è un vincolo perchè questa operazione va eseguita prima della compilazione del progetto, vincolando così l'applicazione a sfruttare solo quel servizio.
Se volessimo collegarci in modo dinamico ad un Web Service?
Una piccola introduzione va fatta descrivendo l'applicazione WSDL.exe che si trova tra i tools messi a disposizioni dal Framework.
Questa applicazione permette di creare una classe proxy con tutte le informazioni necessarie ad un client per consumare il web service. Maggiori informazioni sui possibili comandi li potete trovare a questo link http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrfwebservicesdescriptionlanguagetoolwsdlexe.asp
Sfruttando le capacità di questo tool, si potrà quindi generare il file necessario all'applicazione e compilandolo a runtime avremo a disposizione una libreria che permetterà di sfruttare web service. A questo punto, utilizzando reflection si potrà invocare un qualsiasi metodo o proprietà esposto dal servizio.
string webServiceName = @"http://localhost:2643/WSReports/WS.asmx";
string csFilePath = @"C:\myDEV\DynamicWebServiceReference\DynamicWebServiceReference\bin\Debug\WS.cs";
string outputAssembly = @"ws.dll";
string typeCs = "WS,ws";
string methodCs = "HelloWorld";
string wsdlParameters = @"/language:CS /protocol:SOAP ";
string pathWsdl = "wsdl.exe";
// Genero il file in CSharp interrogando il WebService
System.Diagnostics.Process.Start(pathWsdl, wsdlParameters + webServiceName);
// Creo il compilatore CSharp
ICodeCompiler comp = new CSharpCodeProvider().CreateCompiler();
// Setto i parametri per il compilatore
CompilerParameters parameters = new CompilerParameters();
parameters.OutputAssembly = outputAssembly;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("mscorlib.dll");
parameters.ReferencedAssemblies.Add("System.Web.Services.dll");
parameters.ReferencedAssemblies.Add("System.Xml.dll");
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = false;
// Creo il file compilato dato il file CSharp creato in precedenza
CompilerResults result = comp.CompileAssemblyFromFile(parameters, csFilePath);
// Istanzio la classe appena creata
Type t = Type.GetType(typeCs); if (t != null)
{
object obj = Activator.CreateInstance(t);
// Richiamo il metodo contenuto nella classe
MethodInfo method = t.GetMethod(methodCs, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);
// Lancio il metodo
Console.WriteLine(method.Invoke(obj, new object[] { }) as string);
Console.ReadLine();
}
La classe CSharpCodeProvider permette di compilare un il nostro file .cs generato dal WSDL.exe creando una libreria che poi richiameremo tramite reflection. Alla classe che si occuperà della compilazione a runtime, sono necessari aggiungere i rifrimenti agli assembly utilizzati nel sorgente, e possando gli opportuni parametri genererà la dll per la nostra applicazione.
Una volta esposte le necessarie proprietà in un file di configurazione si avrà un client dinamico sotto ogni aspetto.
Conclusione
Ecco come con poche righe di codice si è arricchito l'applicazione di una caratteristica importante, la flessibilità, data dal fatto di per poter consumare in modo dinamico un web services, portando il vantaggio di non dover compilare la nostra applicazione ogni volta che il servizio web subisca modifiche.
-
Ciao,
tale soluzione funziona con qualsiasi tipo di web service o solo con ASMX?
di
Marco
-
04/03/2008 5.55.32
indietro