marzo 2005 Blog Posts
Il tracing è sicuramente uno degli strumenti più amati (spesso dimenticati) quando ci si trova con dei problemi da risolvere. In Indigo il sistema di tracing è stato ulteriormente potenziato (anche rispetto a WSE). Infatti è possibile abilitare il trace su ogni singolo messaggio (in ingresso ed uscita) definendo nel file di configurazione i seguenti parametri del listener:
<source name="IndigoMessageLogTraceSource" switchValue="Verbose"> <listeners> <add name="multifile" type="System.ServiceModel.Diagnostics.MessageWriterTraceListener, system.servicemodel, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\logs\messages" maxDiskSpace="10000" /> </listeners></source>
e di abilitazione del tracing:
<system.serviceModel> <diagnostics> <messageLogging logEntireMessage="true" maxMessagesToLog="300" logMessagesAtServiceLevel="false" logMalformedMessages="true" logMessagesAtTransportLevel="true" /> </diagnostics></system.serviceModel>
In questo caso tutti i messaggi verranno salvati nella cartella c:\logs\messages (a patto...
I servizi si basano sulla conversazione fra due endpoints. Conversazione significa scambio di messaggi. Lo scambio di messaggi, nel caso dei web services implementati oggi (con ASP.NET 1.x) può avvenire in due modi: one way e request/reply. In altre parole, mando il messaggio e non mi aspetto alcuna risposta, oppure mando la richiesta e mi arriva una risposta rispettivamente.
Indigo introduce un nuovo (concettualmente parlando non è nuovo, ma lo è l'implementazione) pattern di messaggistica: duplex. In pratica è un meccanismo di request/reply differito.
Immaginate di dover fare una richiesta ad un servizio che impiega parecchi minuti per essere eseguito (tanto da...
La CTP di Indigo che possiamo scaricare oggi non è sicuramente definitiva (del resto è una CTP !). L'aspetto interessante di una CTP è quello di poter partecipare attivamente nel dare un feedback affinchè chi lo sta sviluppando possa 'correggere' la rotta per soddisfare quante più esigenze possibili. Ma come dare un feedback, il modo migliore (ad oggi) è postare sul seguente newsgroup: http://msdn.microsoft.com/newsgroups/default.aspx?dg=microsoft.public.windows.developer.winfx.indigo&lang=en&cr=US
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...
Dopo le parole vorrei passare ai fatti :-)
Immaginiamo sia necessario avere un servizio che registri un nuovo contatto e assegni un codice univoco al contatto (uno use case molto semplice). Immaginiamo anche che il servizio possa essere usufruito sia nella nostra intranet, sia attraverso internet, sia sul server locale.
Iniziamo con la definizione del contratto, cioè i messaggi, le operazioni ed il servizio. Dovendo utilizzare questo contratto in più ambiti, decidiamo di creare una class library che contenga solamente il contratto (ed eventualmente la logica di dominio e di persistenza)
Creamo il progetto, aggiungiamo la referenza a System.ServiceModel.dll (contiene le...
Molti sviluppatori hanno a che fare con differenti web site (quando non sono sufficienti le virtual directories). Questo genera alcuni problemi per chi ha Windows 2000 Professional oppure Windows XP in quanto non è possibile (almeno pare) creare più web sites (solo tante belle virtual directories). Per risolvere il problema ci sono due modi:
upgradare il sistema a Windows 2000 server oppure Windows 2003 server
modificare l'home directory local path del sito di default in IIS
Per un pò di tempo, quando passavo da un site all'altro usavo sempre la management console di IIS. La cosa è divenyta abbastanza laboriosa quando passavo da un...
Nell scorso "Indigo Watcher" ho parlato di WAS (Windows Activation Services). WAS è fondamentalmente un driver (molto simile a HTTP.SYS di Windows 2003 e Windows XP SP2) che permette di attivare un servizio Indigo su tre tipologie di canali: HTTP (come farebbe IIS), TCP e Named Pipes.
A differenza di IIS, con WAS è possibile instaurare una comunicazione molto efficiente (al pari di COM+) fra servizio e cliente attraverso un canale Named Pipe ed una serializzazione binaria.
Generalmente siamo abituati ad usare IIS come host application dei web services, usare COM+ per gli enterprise services ed usare applicazioni standard (windows forms, console, web e windows service) in ambito MSMQ, e così via. Con Indigo il tutto si unifica in un unico modello. Infatti, è sufficiente dichiarare un host generico (all'interno di qualsiasi applicazione o servizio) perchè si possa iniziare a ricevere ed inviare richieste (sul/sui canale/i deifiniti nel binding). Considerando l'esempio di ieri, si avrebbe:
ServiceHost<CalculatorService> host = new ServiceHost<CalculatorService>();host.Open();Console.WriteLine("Service is running. Press ENTER to exit...");Console.ReadLine();host.Close();
E' importante notare due aspetti: il primo è che non abbiamo bisogno di fornire...
Siamo abituati con i web services in ASP.NET ad utilizzare (spesso incosapevolmente) l'XmlSerializer per serializzare/deserializzare le nostre istanze di classi nel messaggio SOAP. La caratteristica dell'XmlSerializer (fra le altre cose) è di serializzare i tipi primitivi come tipi XML Schema (definiti sotto il namespace http://www.w3.org/2001/XMLSchema). In Indigo, se definiamo il seguente contratto:
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]public interface ICalculator{ [OperationContract] double Add(double n1, double n2);}
lo schema generato produrrà qualche cosa di veramente nuovo:
<xs:element name="Add"> <xs:complexType> <xs:sequence> <xs:element name="n1" xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/" type="q1:double" /> <xs:element name="n2" xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/" type="q2:double" /> </xs:sequence> </xs:complexType></xs:element>
perchè è stato definito il tipo double (primitivo) sotto un'altro namespace ? In sostanza, by default,...
Un interessante sito dedicato a Yukon.
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...
E' nato l'Enterprise Architect user group - http://www.theeagroup.net/ea/Default.aspx?tabid=38
Ok, ho installato la CTP di marzo (la prima) e non sono riuscito dal trattenermi di scrivere il mio primo web service ala Indigo. Gli esempi che troviamo usano sempre come applicazione host una Windows application (in alcuni caso una console), io non riuscivo a fare a meno di usare IIS.
Quindi, creati i contratti (Indigo ne prevede tre, di cui 2 obbligatori...ne parleremo un'altra volta) ed il servizio, mi scrivo i parametri dell'endpoint nel web.config.
E' arrivato !! Ed ora si può veramente investigare su come sarà il futuro delle applicazioni entrprise. Nel prossimo futuro pubblicherò i miei commenti su Indigo, per ora vi suggerisco una interessantissima overview.
In Visual Studio .NET 2005 Team System ci sarà uno strumento dedicato allo unit testing. Purtroppo tali tools non saranno presenti (almeno per quanto ne sappiamo ora) nelle versioni professional e express. Nulla è comunque perso, infatti lo storico progetto NUnit si sta muovendo nella direzione della compatibilità del framework 2.0.
A volte capita di non trovare una classe WMI su una PC/Server che invece si presenta su un'altro PC/Server. Per rigenerare le classi WMI (e quindi avere la certezza ci siano tutte) è sufficiante richiamare il comando:
wmiadap /f
WMI (Windows Management Instrumentation) è decisamente uno strumento molto potente per chi deve tenere sotto controllo lo stato di qualsiasi (quasi) cosa giri su un PC o in rete (ammesso che si abbiano i privilegi sufficienti).
L'unico vero neo che riscontro in WMI è nella documentazione. Se cercate una classe particolare è molto probabile che non la troviate. Se poi per si vuole avere una lista di tutte le proprietà allora il mal di testa aumenta a dismisura (il debugger non aiuta molto purtroppo).
Esiste però uno strumento (avviabile dalla shell di Windows) molto utile: wbemtest.exe (Windows Managament Instrumentation Tester). Un must...
Durante il VSLive di febbraio si è parlato molto di Indigo, definito come il nuovo sistema di comunicazione proposto da Microsoft. Per chi non ha potuto partecipare alla conferenza, ecco alcuni video...
Quest'oggi ho installato la nuova CTP di febbraio su un pc avente la precedente CTP (deinstallata). Pur avendo deinstallato tutto il nuovo setup continuava ad andare in errore a causa del precedente framework .NET. Da qui ho scoperto che in realtà l'uninstall del Framework 2.0 (beta) non funziona molto bene ed è quindi necessario effettuare due comandi shell:
msiexec.exe /x {9046F10C-F5E7-4871-BED9-8288F19C70DF}
per rimuovere Microsoft Visual J# .NET Redistributable Package 2.0 Beta e
msiexec.exe /x {71F8EFBF-09AF-418D-91F1-52707CDFA274}
per rimuovere Microsoft .NET Framework 2.0 Beta.