<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Security &amp; Architecture : XML</title><link>http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx</link><description>Tags: XML</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Understanding WS-Discovery</title><link>http://blogs.msdn.com/mariofontana/archive/2009/07/23/understanding-ws-discovery.aspx</link><pubDate>Thu, 23 Jul 2009 20:04:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9846596</guid><dc:creator>mfontana</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9846596.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9846596</wfw:commentRss><description>&lt;p&gt;Da oggi e per i prossimi mesi ogni tanto ospiterò dei post scritti da alcuni colleghi/amici di Microsoft affinchè possano raccontare un po’ della loro expertise e competenza tecnica ottenuta durante le tante attività di consulenza e di supporto sul campo. Ovviamente il tema sarà sempre inerente le architetture applicative e la sicurezza…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WSDiscoverybasics_9F20/image_2.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="left" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WSDiscoverybasics_9F20/image_thumb.png" width="68" height="70" /&gt;&lt;/a&gt;In questo post iniziamo con &lt;strong&gt;Alessio Mannelli &lt;/strong&gt;(nella foto, l’unica decente che ho trovato :-)!&amp;#160; &lt;br /&gt;Non è la prima volta che parla su questo “canale”… vi ricordate &lt;strong&gt;quell’Alessio Mannelli &lt;/strong&gt;con il quale quasi un anno fa facemmo un video &lt;a href="http://blogs.msdn.com/mariofontana/archive/2008/09/29/come-funzionano-i-security-token-services.aspx" target="_blank"&gt;dove spiegava il funzionamento dei Security Token Services&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;?? Ebbene si, è sempre lui :-) Alessio lavora nella divisione servizi in Microsoft Italia come Senior Developer ed oramai ha un pluriennale esperienza di &lt;strong&gt;&lt;u&gt;implementazioni&lt;/u&gt;&lt;/strong&gt; di soluzioni SOA nell’enterprise. &lt;/p&gt;  &lt;p&gt;Quindi, non mi dilungo ulteriormente in ciancie e passo la palla ad Alessio per la prima puntata sulla specifica &lt;em&gt;WS-Discovery&lt;/em&gt; che tra l’altro è appena &lt;a href="http://blogs.msdn.com/mariofontana/archive/2009/07/20/net-4-0-beta-1-e-ws-discovery.aspx" target="_blank"&gt;stata rettificata come standard OASIS&lt;/a&gt; ed è presente nel &lt;strong&gt;framework .NET 4.0&lt;/strong&gt;…&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;La Missione&lt;/h4&gt;  &lt;p&gt;Tra le tante specifiche che regolano il variegato mondo dei Web Services &lt;strong&gt;WS-Discovery&lt;/strong&gt; è sicuramente una delle più ambiziose: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;definire un modello standard per la localizzazione di “servizi”, un modello per essere informati quando un nuovo “servizio” viene fatto partire e quando un “servizio” viene spento. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Un modello quindi per effettuare ricerche di “servizi” e recuperarne caratteristiche specifiche come gli endpoint con i quali è possibile dialogare con gli stessi, i protocolli utilizzabili, e molto altro ancora.&lt;/p&gt;  &lt;p&gt;Il modello di Discovery è, o sta diventando, necessario in un mondo dove la “composabilità” delle applicazioni diventa asset fondamentale dell’ecosistema applicativo di una azienda; applicazioni dinamiche per loro natura che, semplicemente, è impossibile connettere a design-time oppure a deployment-time; c’è sicuramente necessità di un modello di “connessione” dinamica a runtime, un modello che valorizzi tutti gli asset di una azienda. &lt;/p&gt;  &lt;p&gt;WS-Discovery è anche un facilitatore di scenari dove trovare ed utilizzare servizi all’interno o all’esterno dell’azienda diventa sempre più difficile; strutture verticali aziendali non allineate, poca (talvolta nessuna) Governance dei programmi e progetti in corso, molti fornitori, sono tra le problematiche più classiche che portano alla proliferazione e conseguente non riutilizzo di Web Service.&lt;/p&gt;  &lt;p&gt;Per ultimo Discovery si pone l’obiettivo di abbracciare sempre più “elementi” non tradizionali di un modello di software a servizi: stampanti, device RFID, macchine fotografiche digitali, proiettori. &lt;/p&gt;  &lt;p&gt;La possibilità di utilizzare un sistema leggero, dinamico, interoperabile per la costruzione di applicazioni composte e distribuite è fondamento della specifica WS-Discovery.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Un servizio “Discoverabile”&lt;/h4&gt;  &lt;p&gt;Per la specifica &lt;a href="http://docs.oasis-open.org/ws-dd/discovery/1.1/cs-01/wsdd-discovery-1.1-spec-cs-01.pdf" target="_blank"&gt;WS-Discovery&lt;/a&gt; ogni servizio viene identificato sulla base di quattro caratteristiche fondamentali:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- EndpointReference&lt;/b&gt; (definito in &lt;strong&gt;WS-Addressing&lt;/strong&gt;)&lt;/p&gt;  &lt;p&gt;Un indirizzo che identifichi univocamente il servizio specifico. L’indirizzo non deve essere per forza un indirizzo fisico, anzi la specifica consiglia l’utilizzo di indirizzi logici (eg. Un identificatore universale univoco, GUID, UUID)&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- Types&lt;/b&gt; (definito in &lt;strong&gt;WS-Discovery&lt;/strong&gt;)&lt;/p&gt;  &lt;p&gt;Ogni servizio web implementa uno o più tipologie di &lt;em&gt;portType&lt;/em&gt;, cosi come definito dalla specifica di &lt;a href="http://www.w3.org/TR/2001/NOTE-wsdl-20010315" target="_blank"&gt;WSDL 1.1&lt;/a&gt;: la nomenclatura utilizzata è di tipo &lt;em&gt;Namespace:ServiceTypeName&lt;/em&gt; e quasi sempre viene inferita dalle specificità dei contratti implementati nei servizi.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- Scopes&lt;/b&gt; (definito in &lt;strong&gt;WS-Discovery&lt;/strong&gt;)&lt;/p&gt;  &lt;p&gt;Ogni servizio può identificare uno o più ambiti o contesti nei quali esiste o per i quali è stato configurato.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- XAddrs&lt;/b&gt; (definito in &lt;strong&gt;WS-Discovery&lt;/strong&gt;)&lt;/p&gt;  &lt;p&gt;Tutti gli indirizzi sui quali il servizio specifico è raggiungibile ed invocabile. Abbiamo quindi un modello per definire completamente uno specifico Servizio:&lt;/p&gt;  &lt;p&gt;EndpointReference, l’identificatore univoco&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Types, le tipologie di “contratti” che il servizio implementa &lt;/li&gt;    &lt;li&gt;Scopes, i contesti applicativi del servizio &lt;/li&gt;    &lt;li&gt;XAddrs, gli indirizzi sui quali il servizio è raggiungibile ed invocabile. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;em&gt;&amp;lt;a:EndpointReference&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;a:Address&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; uuid:98190dc2-0890-4ef8-ac9a-5940995e6119&amp;#160; &lt;br /&gt;&amp;#160; &amp;lt;/a:Address&amp;gt;       &lt;br /&gt;&amp;lt;/a:EndpointReference&amp;gt;       &lt;br /&gt;&amp;lt;d:Types&amp;gt;i:PrintBasic i:PrintAdvanced&amp;lt;/d:Types&amp;gt;       &lt;br /&gt;&amp;lt;d:Scopes&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160; &lt;/em&gt;&lt;a href="ldap:///ou=engineering,o=examplecom,c=us"&gt;&lt;em&gt;ldap:///ou=engineering,o=examplecom,c=us&lt;/em&gt;&lt;/a&gt;&lt;em&gt;      &lt;br /&gt;&amp;#160;&amp;#160; &lt;/em&gt;&lt;a href="ldap:///ou=floor1,ou=b42,ou=anytown,o=examplecom,c=us"&gt;&lt;em&gt;ldap:///ou=floor1,ou=b42,ou=anytown,o=examplecom,c=us&lt;/em&gt;&lt;/a&gt;&lt;em&gt;      &lt;br /&gt;&amp;#160;&amp;#160; &lt;/em&gt;&lt;a href="http://itdept/imaging/deployment/2004-12-04"&gt;&lt;em&gt;http://itdept/imaging/deployment/2004-12-04&lt;/em&gt;&lt;/a&gt;&lt;em&gt;      &lt;br /&gt;&amp;lt;/d:Scopes&amp;gt;       &lt;br /&gt;&amp;lt;d:XAddrs&amp;gt;http://prn-example/PRN42/b42-1668-a&amp;lt;/d:XAddrs&amp;gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;h4&gt;Il modello di Discovery&lt;/h4&gt;  &lt;p&gt;La specifica WS-Discovery definisce sei messaggi specifici:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- Hello/Bye&lt;/b&gt; – messaggi utilizzati da un servizio per annunciare la sua presenza (Hello) o la sua “dipartita” (Bye).&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- Probe/ProbeMatch&lt;/b&gt; – &lt;em&gt;Probe&lt;/em&gt; viene utilizzato per cercare uno specifico tipo di servizio, &lt;em&gt;ProbeMatch&lt;/em&gt; viene utilizzato in risposta alla richiesta.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;- Resolve/ResolveMatch&lt;/b&gt; – &lt;em&gt;Resolve&lt;/em&gt; viene utilizzato per cercare una specifica istanza di servizio, &lt;em&gt;ResolveMatch&lt;/em&gt; viene utilizzata in risposta alla richiesta.&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;Lo scenario di base prevede che i servizi annuncino la loro operatività e quando possibile il loro “scollegamento” dalla rete.(chiaramente nei casi in cui un servizio si spenga per casi eccezionali, difficilmente può inviare un messaggio di &lt;b&gt;Bye&lt;/b&gt;, e la specifica non è giustamente prescrittiva in questo senso…)&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WSDiscoverybasics_9F20/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WSDiscoverybasics_9F20/image_thumb_1.png" width="439" height="258" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figura 1 : Hello e Bye Messages&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In &lt;strong&gt;figura 1&lt;/strong&gt;, viene rappresentato lo scenario di base dove l’ipotetico Client riceve i messaggi di &lt;b&gt;Hello&lt;/b&gt; dai servizi WS1 e WS2 cosi come riceve il messaggio di &lt;b&gt;Bye&lt;/b&gt; dal servizio WS3, il quale nel frattempo si è scollegato dalla rete. Il Client potrà quindi utilizzare le informazioni presenti nei messaggi di protocollo per selezionare il servizio da contattare, qual’ora, chiaramente, implementi le tipologie di servizio richieste.&lt;/p&gt;  &lt;p&gt;Quando invece un Client si connette ad una rete, ed è interessato ad uno specifico servizio, può utilizzare i messaggi di protocollo &lt;b&gt;Probe&lt;/b&gt; e/o &lt;b&gt;Resolve&lt;/b&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WSDiscoverybasics_9F20/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WSDiscoverybasics_9F20/image_thumb_2.png" width="443" height="293" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figura 2 : Probe/Resolve e ProbeMatch/ResolveMath Messages&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In &lt;strong&gt;figura &lt;/strong&gt;2 invece il Client ricerca uno specifico servizio e solo due dei tre servizi presenti e connessi alla rete rispondo con un messaggio di &lt;em&gt;Match&lt;/em&gt;. E’ da notare che, nello scenario definito, la richiesta di &lt;em&gt;&lt;b&gt;Resolve&lt;/b&gt; &lt;/em&gt;difficilmente verrà inviata: ricordiamoci infatti che &lt;em&gt;&lt;b&gt;Resolve&lt;/b&gt; &lt;/em&gt;serve per richiedere i dati di una specifica istanza di servizio, a differenza di &lt;em&gt;&lt;b&gt;Probe&lt;/b&gt; &lt;/em&gt;che ricerca istanze generiche che implementino specifiche tipologie di servizio. In questo caso il messaggio di &lt;em&gt;&lt;b&gt;Resolve&lt;/b&gt; &lt;/em&gt;potrebbe essere utilizzato nel caso in cui, dopo aver ricevuto un &lt;b&gt;&lt;em&gt;ProbeMatch&lt;/em&gt;&lt;/b&gt; alcune informazioni specifiche (tipo gli indirizzi per il dialogo) non fossero presenti.&lt;/p&gt;  &lt;h4&gt;Le modalità operative&lt;/h4&gt;  &lt;p&gt;Le modalità operative definite dalla specifica sono la &lt;strong&gt;&lt;em&gt;“ad-hoc”&lt;/em&gt;&lt;/strong&gt; e la modalità &lt;strong&gt;“managed”&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;La modalità &lt;em&gt;“ad-hoc”&lt;/em&gt; non utilizza nessun servizio di rete né server; i messaggi di &lt;em&gt;&lt;b&gt;Hello/Bye/Probe/Resolve&lt;/b&gt; &lt;/em&gt;vengono inviati in &lt;strong&gt;multicast &lt;/strong&gt;(le relative risposte, dove necessarie, vengono inviate in modalità &lt;strong&gt;unicast &lt;/strong&gt;al client che ha effettuato la richiesta).&lt;/p&gt;  &lt;p&gt;La modalità &lt;strong&gt;&lt;em&gt;“managed” &lt;/em&gt;&lt;/strong&gt;è supportata da un servizio di rete, denominato &lt;strong&gt;Discovery Proxy&lt;/strong&gt;, che funge da accentratore dei servizi presenti nell’ambiente, e che opera per conto loro nel rispondere alle richieste. Riprenderemo il concetto di Discovery Proxy in un prossimo post, poiché merita sicuramente un approfondimento.&lt;/p&gt;  &lt;h4&gt;Conclusioni&lt;/h4&gt;  &lt;p&gt;In questo primo post abbiamo solamente scalfito la superficie della specifica WS-Discovery: vi sono tutta una serie di concetti e di peculiarità proprie della specifica che verranno riprese nella prossima puntata.&lt;/p&gt;  &lt;p&gt;Saluti,&lt;/p&gt;  &lt;p&gt;Alessio Mannelli&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9846596" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/.NET+4/default.aspx">.NET 4</category></item><item><title>Microsoft, Apache… un ossimoro??</title><link>http://blogs.msdn.com/mariofontana/archive/2009/06/07/microsoft-apache-un-ossimoro.aspx</link><pubDate>Sun, 07 Jun 2009 11:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9702640</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9702640.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9702640</wfw:commentRss><description>&lt;p&gt;Innanzitutto prima di generare uno sciopone a qualcuno vi prego di notare la punteggiatura nel titolo di questo post !!! Microsoft &lt;strong&gt;VIRGOLA &lt;/strong&gt;Apache e non &lt;strong&gt;Microsoft Apache &lt;/strong&gt;:-) Nessuna paura quindi , non abbiamo acquistato Apache !!!! Però c’è da dire che questa notizia, come architetto, mi ha reso proprio contento. Alzi la mano (tanto vi vedo) chi di voi si è trovato almeno una volta nella situazione di far parlare del codice .NET con quello JAVA e/o PHP o viceversa? E tenga su la mano chi ha incontrato qualche “piccolissima” difficoltà nella configurazione e settaggi vari nei rispettivi ambienti !!!! Nessuno ?? ok allora questo post non fa per voi :-)&lt;/p&gt;  &lt;p&gt;Diciamo che c’è stato un evento epocale…&lt;strong&gt; Microsoft partecipa alla keynote della conferenza JavaOne!! &lt;/strong&gt;Infatti durante la conferenza JavaOne &lt;strong&gt;Steven Martin&lt;/strong&gt; - Senior Director, Developer Platform Product Management – e &lt;strong&gt;Aisling MacRunnels &lt;/strong&gt;- Sun Vice President- hanno annunciato durante la keynote che &lt;strong&gt;Sun &lt;/strong&gt;parteciperà attivamente al progetto open-source &lt;strong&gt;Stonehenge &lt;/strong&gt;inizialmente creato da &lt;strong&gt;Microsoft&lt;/strong&gt;, &lt;strong&gt;WS02&lt;/strong&gt;, &lt;strong&gt;University of Moratuwa&lt;/strong&gt;, &lt;strong&gt;Progress Software&lt;/strong&gt;, &lt;strong&gt;Red Hat &lt;/strong&gt;e &lt;strong&gt;Eviware&lt;/strong&gt;. In particolare Sun si occuperà della realizzazione Java/Metro della soluzione &lt;a href="http://www.interoperabilitybridges.com/Project.aspx/Stonehenge_-_StockTrader_community_project" target="_blank"&gt;StockTrader&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Microsoft (anche se molti non lo sanno) ha partecipato e sta partecipando a &lt;a href="http://port25.technet.com/archive/2008/11/07/open-source-interoperability-projects-at-microsoft.aspx" target="_blank"&gt;molti progetti open source&lt;/a&gt; ma questa è la prima volta che Microsoft partecipa come &lt;strong&gt;code contributor &lt;/strong&gt;in un progetto Apache!!&lt;/p&gt;  &lt;p&gt;Lo scopo di questo progetto è nobile : realizzare &lt;strong&gt;&lt;u&gt;in concreto &lt;/u&gt;&lt;/strong&gt;degli scenari di interoperabilità e di best practices tra applicazioni e web services sviluppati su stack tecnologici diveri. &lt;a href="http://blogs.msdn.com/mariofontana/archive/2009/05/20/microsoft-e-saml-2-0-protocol.aspx" target="_blank"&gt;Come dissi in questo mio post&lt;/a&gt;&amp;#160; &lt;em&gt;“non basta avere delle specifiche standardizzate per realizzare veramente degli scenari di interoperabilità” (sintetizzato)&lt;/em&gt; !!! I motivi sono molteplici : non tutti i vendor implementano le medesime specifiche anche se standardizzate, non sempre è chiaro come configurare i vari ambienti e prodotti, spesso ci sono delle piccole differenze in termini di serializzazione, encoding che se non gestite possono rendere difficile la realizzazione del progetto… &lt;/p&gt;  &lt;p&gt;Per questo motivo il progetto Stonehenge &lt;strong&gt;&lt;u&gt;realizza &lt;/u&gt;&lt;/strong&gt;delle applicazioni di esempio basate su stack &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;.NET, &lt;/strong&gt;&amp;#160;&lt;strong&gt;PHP ma anche Python e Ruby&amp;#160; &lt;/strong&gt;in grado di interoperare utilizzando un set comune di specifiche standard definte dal &lt;strong&gt;W3C &lt;/strong&gt;e &lt;strong&gt;OASIS&lt;/strong&gt;. Stiamo parlando in prevalenza di comunicazioni basate sugli standard WS-*. I vari sorgenti li potete trovare &lt;a href="https://svn.apache.org/repos/asf/incubator/stonehenge/contrib/stocktrader/" target="_blank"&gt;nel repository di stocktrader&lt;/a&gt; : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/e9279e09cf76_8B2A/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/e9279e09cf76_8B2A/image_thumb.png" width="361" height="287" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9702640" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/SOA/default.aspx">SOA</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Interoperabilit_E000_/default.aspx">Interoperabilità</category></item><item><title>Windows Web Services API – Come utilizzare gli esempi della documentazione su MSDN</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/28/windows-web-services-api-come-utilizzare-gli-esempi-della-documentazione-su-msdn.aspx</link><pubDate>Sat, 28 Mar 2009 06:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9511176</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9511176.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9511176</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/dd430450(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd430450(VS.85).aspx"&gt;Su MSDN&lt;/A&gt; ci sono molti esempi di utilizzo delle &lt;STRONG&gt;Windows Web Services API.&lt;/STRONG&gt; Per utilizzarli o si scaricano tutti i files di esempio (*.cpp, *.wsdl e makefile) oppure si crea una nuova solution in Visual Studio 2008 al cui interno si creano due applicazioni di tipo console.&lt;/P&gt;
&lt;P&gt;Per la seconda opzione consiglio questo ordine :&lt;/P&gt;
&lt;P&gt;Prima di tutto createvi una nuova solution contenente due progetti di tipo console e per entrambi togliete il supporto ai &lt;EM&gt;precompiled headers &lt;/EM&gt;e aggiungete al linker la libreria &lt;EM&gt;webservices.lib &lt;/EM&gt;(per il passo passo di queste azioni consultare &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx"&gt;&lt;STRONG&gt;questo mio post&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;)&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;Partiamo dal service (prenderò come spunto l’esempio &lt;A href="http://msdn.microsoft.com/en-us/library/dd323329(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323329(VS.85).aspx"&gt;&lt;STRONG&gt;HttpCalculatorServiceExample su MSDN&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;):&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Creiamo una directory &lt;EM&gt;WSMetadata&lt;/EM&gt; e creiamo il file &lt;EM&gt;CalculatorService.wsdl&lt;/EM&gt; copiando il contenuto &lt;A href="http://msdn.microsoft.com/en-us/library/dd323329(VS.85).aspx#wsw.calculatorservice.wsdl" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323329(VS.85).aspx#wsw.calculatorservice.wsdl"&gt;&lt;STRONG&gt;da qui&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Sempre nella directory &lt;EM&gt;WSMetadata&lt;/EM&gt; lanciamo l’utility &lt;EM&gt;Wsutil.exe&lt;/EM&gt; *.* che ci creerà i seguenti files :&lt;STRONG&gt; &lt;BR&gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;EM&gt;CalculatorService.wsdl.c&amp;nbsp; &lt;BR&gt;CalculatorService.wsdl.h &lt;BR&gt;&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;Aggiungiamoli al nostro progetto.&lt;/LI&gt;
&lt;LI&gt;A questo punto nel nostro file &lt;EM&gt;Service.cpp&lt;/EM&gt; copiamo il codice presente &lt;A href="http://msdn.microsoft.com/en-us/library/dd323329(VS.85).aspx#wsw.httpcalculatorservice.cpp" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323329(VS.85).aspx#wsw.httpcalculatorservice.cpp"&gt;qui&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;e inseriamo in testa gli &lt;EM&gt;#include &lt;/EM&gt;files &lt;BR&gt;&lt;BR&gt;&lt;EM&gt;&lt;STRONG&gt;#&lt;/STRONG&gt;include &amp;lt;webservices.h&amp;gt; &lt;BR&gt;#include "wsmetadata\\CalculatorService.wsdl.h"&lt;/EM&gt; &lt;BR&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;a questo punto possiamo compilare e tutto dovrebbe funzionare :-)&lt;/P&gt;
&lt;P&gt;Passiamo al client (riferimento &lt;A href="http://msdn.microsoft.com/en-us/library/dd323328(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323328(VS.85).aspx"&gt;&lt;STRONG&gt;MSDN qui&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Aggiungiamo i files del punto 2 precedente.&lt;/LI&gt;
&lt;LI&gt;A questo punto nel nostro file &lt;EM&gt;Client.cpp &lt;/EM&gt;copiamo il codice presente &lt;A href="http://msdn.microsoft.com/en-us/library/dd323328(VS.85).aspx#wsw.httpcalculatorclient.cpp" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323328(VS.85).aspx#wsw.httpcalculatorclient.cpp"&gt;qui&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Eseguiamo il punto 5 precedente. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Compilatina e anche il client dovrebbe essere pronto. A questo punto lanciate il &lt;EM&gt;service&lt;/EM&gt; e poi il &lt;EM&gt;client &lt;/EM&gt;e la calcolatrice unmanaged funzionerà :-)&lt;/P&gt;
&lt;P&gt;--Mario&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9511176" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx">C/C++</category></item><item><title>Windows Web Services API : Step-By-Step per creare un Web Service</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx</link><pubDate>Fri, 27 Mar 2009 12:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9511043</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9511043.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9511043</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx"&gt;Nel mio post precedente&lt;/A&gt; abbiamo visto come scrivere un client C/C++ capace di invocare un servizio scritto in WCF.&lt;/P&gt;
&lt;P&gt;In questo post vedremo come scrivere l’equivalente del servizio WCF in codice unmanaged tramite le &lt;STRONG&gt;WWSAPI&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;A differenza della realizzazione di un client il server comporta ovviamente la scrittura a priori del WSDL e degli XSD !!! Questo perchè il linguaggio C/C++ non è così ricco di metadati come il framework .NET !! Quindi per gli amanti del &lt;EM&gt;contract-first &lt;/EM&gt;nessun problema, mentre per i più pigri è sempre possibile definire l’interfaccia in WCF e quindi scaricare i metadati via svcutil /t:metadata :-) (come abbiamo fatto per il client)…&lt;/P&gt;
&lt;P&gt;A questo punto possiamo avventurarci nella scrittura del nostro primo Web Service in C/C++ &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Creiamo un nuovo progetto di tipo &lt;EM&gt;Win32 Console Application&lt;/EM&gt;. &lt;/LI&gt;
&lt;LI&gt;Andiamo nella configurazione del progetto e selezioniamo &lt;EM&gt;All Configuration &lt;/EM&gt;in alto a sinistra nella finestra di Property Page. 
&lt;OL&gt;
&lt;LI&gt;Selezioniamo &lt;EM&gt;Configuration Properties&lt;/EM&gt;-&amp;gt;&lt;EM&gt;C/C++ &lt;/EM&gt;–&amp;gt; &lt;EM&gt;Precompiled Headers &lt;/EM&gt;e alla voce &lt;EM&gt;Create/Use Precompiled Header&lt;/EM&gt; impostiamo : &lt;EM&gt;Not Using Precompiled Headers.&lt;/EM&gt; &lt;/LI&gt;
&lt;LI&gt;Selezioniamo &lt;EM&gt;Configuration Properties&lt;/EM&gt;-&amp;gt;&lt;EM&gt;Linker-&amp;gt;Input &lt;/EM&gt;e alla voce Additional Dependencies scriviamo &lt;STRONG&gt;WebServices.lib&lt;/STRONG&gt;. &lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;
&lt;LI&gt;Premiamo OK alla finestra di configurazione. &lt;/LI&gt;
&lt;LI&gt;Includiamo i .h e .c presenti nella directory WSMetadata. &lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Aggiungiamo al progetto i files .h e .c presenti nella directory WSMetadata. &lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Aggiungiamo l’include ai file .h inseriti nel progetto e a &amp;lt;webservices.h&amp;gt;: &lt;BR&gt;&lt;BR&gt;#include &amp;lt;webservices.h&amp;gt; &lt;/EM&gt;
&lt;P&gt;&lt;EM&gt;#include "..\\wsmetadata\\mariofontanapublicdemos.com.CalculatorService.Bindings.wsdl.h" &lt;BR&gt;#include "..\\wsmetadata\\mariofontanapublicdemos.com.CalculatorService.wsdl.h" &lt;BR&gt;#include "..\\wsmetadata\\mariofontanapublicdemos.com.CalculatorService.xsd.h" &lt;BR&gt;#include "..\\wsmetadata\\schemas.microsoft.com.2003.10.Serialization.xsd.h"&lt;/EM&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;Compiliamo… &lt;/LI&gt;
&lt;LI&gt;Copiamo il codice riportato sotto e poi sempre animati da fiducia… compiliamo :-) &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;EM&gt;#include &amp;lt;iostream&amp;gt; &lt;BR&gt;#include &amp;lt;conio.h&amp;gt; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// helper routine to print error object &lt;BR&gt;void PrintError(HRESULT errorCode, WS_ERROR* error) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Failure: errorCode=0x%lx\n", errorCode); &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (errorCode == E_INVALIDARG || errorCode == WS_E_INVALID_OPERATION) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Correct use of the APIs should never generate these errors &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("The error was due to an invalid use of an API.&amp;nbsp; This is likely due to a bug in the program.\n"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //DebugBreak(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hr = NOERROR; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (error != NULL) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG errorCount; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = WsGetErrorProperty(error, WS_ERROR_PROPERTY_STRING_COUNT, &amp;amp;errorCount, sizeof(errorCount)); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (ULONG i = 0; i &amp;lt; errorCount; i++) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_STRING string; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = WsGetErrorString(error, i, &amp;amp;string); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%.*s\n", string.length, string.chars); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;Exit: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Could not get error string (errorCode=0x%lx)\n", hr); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;} &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;//questa è la vera e propria funzione callback che implementa il metodo Add&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HRESULT CALLBACK Add( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __in const WS_OPERATION_CONTEXT* context, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __in int a, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __in int b, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __out __int64* result, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __in_opt const WS_ASYNC_CONTEXT* asyncContext, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __in_opt WS_ERROR* error) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNREFERENCED_PARAMETER(context); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNREFERENCED_PARAMETER(asyncContext); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNREFERENCED_PARAMETER(error); &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *result = a + b; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf ("%d + %d = %X\n", a, b, *result); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fflush(stdout); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return NOERROR; &lt;BR&gt;} &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;int _tmain(int argc, _TCHAR* argv[]) &lt;BR&gt;{ &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hr; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_ERROR* error; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = WsCreateError(NULL,0, &amp;amp;error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) return -1; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_HEAP* heap; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr= WsCreateHeap(1024,0,NULL,0,&amp;amp;heap, error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeError(error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/EM&gt;wprintf(L"Hosting del mio primo Web Service in C/C++...\n");&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BasicHttpBinding_ICalculatorFunctionTable Functions = {Add}; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_STRING url = WS_STRING_VALUE (L"&lt;/EM&gt;&lt;A href="http://localhost:8080/NativeCalculatorService%22);" mce_href='http://localhost:8080/NativeCalculatorService");'&gt;&lt;EM&gt;http://localhost:8080/NativeCalculatorService");&lt;/EM&gt;&lt;/A&gt; &lt;BR&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_HTTP_BINDING_TEMPLATE templateValue = {}; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_SERVICE_ENDPOINT* serviceEndpoint; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = BasicHttpBinding_ICalculator_CreateServiceEndpoint (&amp;amp;templateValue,url,&amp;amp;Functions,NULL,NULL,0,heap,&amp;amp;serviceEndpoint,error);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintError(hr,error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeHeap(heap); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeError(error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS_SERVICE_HOST* host = NULL; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const WS_SERVICE_ENDPOINT* serviceEndpoints[1]; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serviceEndpoints[0] = serviceEndpoint; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = WsCreateServiceHost(serviceEndpoints, 1,NULL, 0, &amp;amp;host, error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintError(hr,error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeHeap(heap); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeError(error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = WsOpenServiceHost(host,NULL,error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(FAILED(hr)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintError(hr,error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeServiceHost(host); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeHeap(heap); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeError(error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wprintf(L"Premi Enter per chiudere il servizio...\n"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _getch(); &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsCloseServiceHost(host, NULL, error); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeServiceHost(host); &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeHeap(heap); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WsFreeError(error); &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;}&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;a questo punto Ctrl+F5 e lanciamo il nostro Web Service e torniamo sul codice client dove andremo a commentare il &lt;BR&gt;&lt;BR&gt;&lt;EM&gt;#define _WCF&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;in modo da chiamare il Web Service che abbiamo appena creato. Come si può notare il codice client è il medesimo (salvo l’url) e possiamo invocare indistintamente Web Services scritti in WCF e in C/C++.&lt;/P&gt;
&lt;P&gt;La schematizzazione del codice è la seguente :&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIStepByStepperilWebS_D684/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIStepByStepperilWebS_D684/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIStepByStepperilWebS_D684/image_thumb.png" width=272 height=344 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIStepByStepperilWebS_D684/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;--Mario&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9511043" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx">C/C++</category></item><item><title>Windows Web Services API : Step-&gt;By-Step per il client</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx</link><pubDate>Thu, 26 Mar 2009 17:21:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9510922</guid><dc:creator>mfontana</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9510922.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9510922</wfw:commentRss><description>&lt;p&gt;Il metodo più semplice per provare la nuova libreria WWSAPI è quella di partire da uno scenario WWSAPI client che si integra con un servizio WCF. Passo successivo creeremo lo stesso servizio in C/C++ con WWSAPI e vedremo che lato client ci basterà cambiare l’url del Web Service permettendoci di invocare indistintamente quello sviluppato in WCF e in WWSAPI.&lt;/p&gt;  &lt;p&gt;Per crearsi l’ambiente dovremo scaricare il seguente software :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a91dc12a-fc94-4027-b67e-46bab7c5226c&amp;amp;displaylang=en" target="_blank"&gt;Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 : BETA&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://connect.microsoft.com/WNDP/content/content.aspx?ContentID=11205" target="_blank"&gt;Beta of Windows Web Services API for Windows XP, Vista, Server 2003 and Server 2008&lt;/a&gt; (solo se non si sviluppa su WIndows 7 o Windows Server 2008 R2)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Web Service in WCF&lt;/h3&gt;  &lt;p&gt;Come prima cosa costruiamoci un servizio WCF (tipo di progetto VS2008 : &lt;em&gt;WCF Service Application&lt;/em&gt;) che implementa una semplice interfaccia (ovviamente lo si può provare anche con un ASMX) :&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;namespace CalculatorService      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [ServiceContract(Namespace = &amp;quot;&lt;/em&gt;&lt;a href="http://MarioFontanaPublicDemos.com/CalculatorService/&amp;quot;)]"&gt;&lt;em&gt;http://MarioFontanaPublicDemos.com/CalculatorService/&amp;quot;)]&lt;/em&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; public interface ICalculator      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [OperationContract]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long Add(int a, int b); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Assicurandoci di impostare il binding su basicHttpBindings. Dovremo avere un &lt;strong&gt;web.config &lt;/strong&gt;simile a questo:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;lt;system.serviceModel&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;services&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;service behaviorConfiguration=&amp;quot;CalculatorService.CalculatorServiceBehavior&amp;quot; name=&amp;quot;CalculatorServiceServiceConfiguration&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&amp;quot; bindingNamespace=&amp;quot;&lt;/em&gt;&lt;a href="http://MarioFontanaPublicDemos.com/CalculatorService/Bindings&amp;quot;"&gt;&lt;em&gt;http://MarioFontanaPublicDemos.com/CalculatorService/Bindings&amp;quot;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; binding=&amp;quot;basicHttpBinding&amp;quot; bindingConfiguration=&amp;quot;&amp;quot; contract=&amp;quot;CalculatorService.ICalculator&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/service&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/services&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;behaviors&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceBehaviors&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;behavior name=&amp;quot;CalculatorService.CalculatorServiceBehavior&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;false&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/behavior&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceBehaviors&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/behaviors&amp;gt;       &lt;br /&gt;&amp;lt;/system.serviceModel&amp;gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A questo punto il nostro servizio dovrebbe avere un WSDL di questo tipo : &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WWSAPIStepByStep_10215/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WWSAPIStepByStep_10215/image_thumb_2.png" width="397" height="380" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Prima di abbandonare il nostro servizio ricordiamoci di rendere fissa la porta su localhost. Nel caso di esempio : &lt;strong&gt;62881 (quindi avremo : l’endpoint su : &lt;a title="http://localhost:62881/CalculatorService.svc" href="http://localhost:62881/CalculatorService.svc"&gt;http://localhost:62881/CalculatorService.svc&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;Client C/C++&lt;/h3&gt;  &lt;p&gt;Per creare il client C/C++ che consuma il nostro servizio WCF dobbiamo fare i seguenti passi :&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WWSAPIStepByStep_10215/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WWSAPIStepByStep_10215/image_thumb_4.png" width="377" height="172" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Ottenere i metadati dal Web Service tramite l’utility svcutil.exe (&lt;em&gt;Microsoft Service Model Metadata Tool)&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Trasformare i metadati in dichiarazioni C tramite una seconda utility a riga di comando : wsutil.exe (&lt;em&gt;Windows Web Services Tool) &lt;/em&gt;Attenzione : controllate che sia la versione &lt;strong&gt;1.0079&lt;/strong&gt;. in alcuni casi ho riscontrato che la versione &lt;strong&gt;1.0069 &lt;/strong&gt;che non funziona !!! &lt;/li&gt;    &lt;li&gt;Step succesivo scrivere il codice client. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Vediamo passo passo come fare :&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Creiamo un nuovo progetto di tipo &lt;em&gt;Win32 Console Application&lt;/em&gt; (può andare anche un qualsiasi progetto con interfaccia grafica, ma sapete io sono un nostalgico della cara vecchia console :-) e premiamo pure su finish perchè non ci interessa nessuna customizzazione. &lt;/li&gt;    &lt;li&gt;Andiamo nella configurazione del progetto e selezioniamo &lt;em&gt;All Configuration &lt;/em&gt;in alto a sinistra nella finestra di Property Page.       &lt;ol&gt;       &lt;li&gt;Selezioniamo &lt;em&gt;Configuration Properties&lt;/em&gt;-&amp;gt;&lt;em&gt;C/C++ &lt;/em&gt;–&amp;gt; &lt;em&gt;Precompiled Headers &lt;/em&gt;e alla voce &lt;em&gt;Create/Use Precompiled Header&lt;/em&gt; impostiamo : &lt;em&gt;Not Using Precompiled Headers.&lt;/em&gt; &lt;/li&gt;        &lt;li&gt;Selezioniamo &lt;em&gt;Configuration Properties&lt;/em&gt;-&amp;gt;&lt;em&gt;Linker-&amp;gt;Input &lt;/em&gt;e alla voce Additional Dependencies scriviamo &lt;strong&gt;WebServices.lib&lt;/strong&gt;. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Premiamo OK alla finestra di configurazione. &lt;/li&gt;    &lt;li&gt;Apriamo una console amministrativa e andiamo nella directory del nostro client. Qui possiamo creare una directory ad esempio : &lt;strong&gt;WSMetadata&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Entriamo nella directory WSMetadata e lanciamo la nuova versione dell’utility a riga di comando &lt;em&gt;svcutil.exe /t:metadata &amp;lt;indirizzo del nostro servizio WCF&amp;gt; quindi sarà ad esempio :        &lt;br /&gt;&lt;/em&gt;&lt;em&gt;       &lt;br /&gt;svcutil.exe /t:metadata &lt;/em&gt;&lt;a title="http://localhost:62881/CalculatorService.svc" href="http://localhost:62881/CalculatorService.svc"&gt;http://localhost:62881/CalculatorService.svc&lt;/a&gt;.       &lt;br /&gt;      &lt;br /&gt;In questo modo abbiamo scaricato i metadati dal servizio, ovvero il WSDL e gli xsd, e dovremmo avere un file WSDL e uno o più file XSD. Nel nostro caso avremo       &lt;br /&gt;      &lt;br /&gt;&lt;em&gt;mariofontanapublicdemos.com.CalculatorService.Bindings.wsdl        &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.wsdl         &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.xsd         &lt;br /&gt;schemas.microsoft.com.2003.10.Serialization.xsd         &lt;br /&gt;&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;A questo punto lanciamo un’altra utility a riga di comando &lt;em&gt;wsutil.exe *.* &lt;/em&gt;(assicurarsi che non ci siano altri file oltre quelli creati nel punto precedente perchè altrimenti viene ovviamente generato un errore). Con questa operazione abbiamo creato per ogni file presente nella directory un equivalente .c e .h con la descrizione dello schema, del wsdl e delle policy che andermo ad includere nel nostro progetto. Nel nostro caso avremo quindi 12 files :       &lt;br /&gt;      &lt;p&gt;&lt;em&gt;mariofontanapublicdemos.com.CalculatorService.Bindings.wsdl          &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.Bindings.wsdl.c           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.Bindings.wsdl.h           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.wsdl           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.wsdl.c           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.wsdl.h           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.xsd           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.xsd.c           &lt;br /&gt;mariofontanapublicdemos.com.CalculatorService.xsd.h           &lt;br /&gt;schemas.microsoft.com.2003.10.Serialization.xsd           &lt;br /&gt;schemas.microsoft.com.2003.10.Serialization.xsd.c           &lt;br /&gt;schemas.microsoft.com.2003.10.Serialization.xsd.h&lt;/em&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;Aggiungiamo al progetto i files .h e .c appena creati nella directory &lt;em&gt;WSMetadata&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Aggiungiamo l’include ai file .h inseriti nel progetto e a &lt;em&gt;&amp;lt;webservices.h&amp;gt;&lt;/em&gt;:       &lt;br /&gt;      &lt;br /&gt;&lt;em&gt;#include &amp;lt;webservices.h&amp;gt;        &lt;br /&gt;#include &amp;quot;..\\wsmetadata\\mariofontanapublicdemos.com.CalculatorService.Bindings.wsdl.h&amp;quot;         &lt;br /&gt;#include &amp;quot;..\\wsmetadata\\mariofontanapublicdemos.com.CalculatorService.wsdl.h&amp;quot;         &lt;br /&gt;#include &amp;quot;..\\wsmetadata\\mariofontanapublicdemos.com.CalculatorService.xsd.h&amp;quot;         &lt;br /&gt;#include &amp;quot;..\\wsmetadata\\schemas.microsoft.com.2003.10.Serialization.xsd.h&amp;quot;         &lt;br /&gt;&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Primo momento della verità : compilatina…e dovrebbe andare tutto OK &lt;/li&gt;    &lt;li&gt;Copiamo il codice riportato sotto e poi possiamo compilare nuovamente fiduciosi :-) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;#include &amp;lt;iostream&amp;gt;    &lt;br /&gt;#include &amp;lt;conio.h&amp;gt; &lt;/p&gt;  &lt;p&gt;WCHAR* WsGetErrorDescription(HRESULT hr); &lt;/p&gt;  &lt;p&gt;//#define _WCF &lt;/p&gt;  &lt;p&gt;int _tmain(int argc, _TCHAR* argv[])    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; HRESULT hr;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WS_ERROR* error;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; hr = WsCreateError(NULL,0, &amp;amp;error);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (FAILED(hr)) return -1; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; WS_HEAP* heap;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; hr= WsCreateHeap(1024,0,NULL,0,&amp;amp;heap, error);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if(FAILED(hr))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WsFreeError(error);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return -1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; WS_SERVICE_PROXY* serviceProxy;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WS_HTTP_BINDING_TEMPLATE templateValue = {}; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; hr = BasicHttpBinding_ICalculator_CreateServiceProxy(    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;templateValue,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NULL,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;serviceProxy,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; error); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if(FAILED(hr))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WsFreeHeap(heap);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WsFreeError(error);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return -1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; WS_ENDPOINT_ADDRESS address = {}; &lt;/p&gt;  &lt;p&gt;#ifdef _WCF    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WS_STRING Url = WS_STRING_VALUE(L&amp;quot;&lt;a href="http://localhost:62881/CalculatorService.svc&amp;quot;);"&gt;http://localhost:62881/CalculatorService.svc&amp;quot;);&lt;/a&gt;     &lt;br /&gt;#else     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WS_STRING Url = WS_STRING_VALUE(L&amp;quot;&lt;a href="http://localhost:8080/NativeCalculatorService&amp;quot;);"&gt;http://localhost:8080/NativeCalculatorService&amp;quot;);&lt;/a&gt;     &lt;br /&gt;#endif &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; address.url = Url;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; hr = WsOpenServiceProxy(serviceProxy, &amp;amp;address, NULL, error); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (FAILED(hr))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WsFreeServiceProxy(serviceProxy);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WsFreeHeap(heap);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WsFreeError(error);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return -1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int a = 1;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; int b = 2;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; __int64 result=0;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; hr = BasicHttpBinding_ICalculator_Add(serviceProxy,a,b,&amp;amp;result,heap,NULL,NULL,NULL,error); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; if (SUCCEEDED(hr))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wprintf(L&amp;quot;Invocazione del servizio Calculator : %d + %d = %X \n&amp;quot;, a,b,result); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; std::wcerr &amp;lt;&amp;lt; static_cast&amp;lt;LPCTSTR&amp;gt;(WsGetErrorDescription(hr)) &amp;lt;&amp;lt; std::endl; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WS_STRING errordesc;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; hr = ::WsGetErrorString(error, 0, &amp;amp;errordesc);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (SUCCEEDED(hr))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; std::wcerr &amp;lt;&amp;lt; static_cast&amp;lt;LPCTSTR&amp;gt;(errordesc.chars) &amp;lt;&amp;lt; std::endl;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; wprintf(L&amp;quot;Ti sei ricordato di attivare il service host??&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; _getch(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; WsCloseServiceProxy(serviceProxy, NULL, error); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; WsFreeServiceProxy(serviceProxy); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; WsFreeHeap(heap);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WsFreeError(error);     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;WCHAR* WsGetErrorDescription(HRESULT hr)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; switch(hr){ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_S_ASYNC:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The function call is completing asynchronously&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_S_END:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; There are no more messages available on the channel&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_INVALID_FORMAT:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The input data was not in the expected format or did not have the expected value&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_OBJECT_FAULTED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation could not be completed because the object is in a faulted state due to a previous error&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_NUMERIC_OVERFLOW:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation could not be completed because it would lead to numeric overflow&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_INVALID_OPERATION:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation is not allowed due to the current state of the object&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_OPERATION_ABORTED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation was aborted&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_ACCESS_DENIED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; Access was denied by the remote endpoint&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_OPERATION_TIMED_OUT:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation did not complete within the time allotted&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_OPERATION_ABANDONED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation was abandoned&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_QUOTA_EXCEEDED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; A quota was exceeded&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_NO_TRANSLATION_AVAILABLE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The information was not available in the specified language&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_SECURITY_VERIFICATION_FAILURE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; Security verification was not successful for the received data&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ADDRESS_IN_USE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The address is already being used&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ADDRESS_NOT_AVAILABLE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The address is not valid for this context&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_NOT_FOUND:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint does not exist or could not be located&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_NOT_AVAILABLE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint is not currently in service at this location&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_FAILURE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint could not process the request&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_UNREACHABLE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint was not reachable&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_ACTION_NOT_SUPPORTED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The operation was not supported by the remote endpoint&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_TOO_BUSY:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint is unable to process the request due to being overloaded&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_FAULT_RECEIVED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; A message containing a fault was received from the remote endpoint&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_ENDPOINT_DISCONNECTED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The connection with the remote endpoint was terminated&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_FAILURE:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The HTTP proxy server could not process the request&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_NOT_FOUND:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The HTTP proxy server does not exist or could not be located&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_ACCESS_DENIED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; Access was denied by the HTTP proxy server&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_NOT_SUPPORTED:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The requested feature is not available on this platform&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_REQUIRES_BASIC_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The HTTP proxy server requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_REQUIRES_DIGEST_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The HTTP proxy server requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_REQUIRES_NTLM_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The HTTP proxy server requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_PROXY_REQUIRES_NEGOTIATE_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The HTTP proxy server requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_SERVER_REQUIRES_BASIC_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_SERVER_REQUIRES_DIGEST_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_SERVER_REQUIRES_NTLM_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_SERVER_REQUIRES_NEGOTIATE_AUTH:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The remote endpoint requires HTTP authentication scheme &amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case WS_E_INVALID_ENDPOINT_URL:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return L&amp;quot; The endpoint address URL is invalid&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;Volendo schematizzare le macro funzioni del codice :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WWSAPIStepByStep_10215/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WWSAPIStepByStep_10215/image_thumb.png" width="299" height="351" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lanciando prima il Web Service in WCF e poi il nostro clientino dovremmo avere la fatidica risposta della somma !! &lt;/p&gt;  &lt;p&gt;Nel prossimo post creeremo lo stesso servizio con le Windows Web Services API per dimostrare la completa interoperabilità tra WCF e WWSAPI.&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9510922" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx">C/C++</category></item><item><title>Come integrare vecchi e nuovi applicativi C/C++ con i Web Services</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/24/come-integrare-vecchi-e-nuovi-applicativi-c-c-con-i-web-services.aspx</link><pubDate>Tue, 24 Mar 2009 12:35:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9503801</guid><dc:creator>mfontana</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9503801.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9503801</wfw:commentRss><description>&lt;p&gt;Con l’uscita della prima beta di Windows 7 (e Windows Server 2008 R2) sono disponibili delle nuove API – &lt;b&gt;Windows Web Services API (WWSAPI) &lt;/b&gt;- che permettono ai programmatori C/C++ di integrare le loro applicazioni “unmanaged” (= non .NET) con il variopinto mondo dei Web Services . Le WWSAPI permettono di creare sia la parte client che la parte server (Web Services) in puro stile C. Le applicazioni C/C++ oggi sono ancora fortemente presenti nei reparti IT e (spesso) non ci sono particolari ragioni per doverle riscrivere in codice .NET o Java!! Quindi le applicazioni C/C++ sono ancora una realtà e come tale è giusto che possano facilmente, ovvero a basso costo e senza overhead, integrarsi con tutti quei Web Services che tanto vanno di moda da qualche anno a questa parte. &lt;/p&gt;  &lt;p&gt;Come spesso racconto durante i seminari o durante gli incontri con i clienti l’adozione dei Web Services all’interno di un reparto IT (grande o piccolo che sia) può essere suddiviso in due momenti : &lt;i&gt;Enterprise Efficency&lt;/i&gt; ed &lt;i&gt;Enterprise Agility&lt;/i&gt;. Nel primo caso stiamo parlando di tutte quelle aziende (ad oggi la maggior parte in Italia) che iniziano a sperimentare l’efficacia dei Web Services e li utilizzano essenzialmente come mezzo per &lt;b&gt;facilitare l’interoperabilità&lt;/b&gt; tra software che nativamente non si parlano (spesso per ragioni tecnologiche). Facilitare l’interoperabilità signifca essere più efficienti, da cui &lt;b&gt;&lt;i&gt;Enterprise Efficiency&lt;/i&gt;&lt;/b&gt;.    &lt;br /&gt;Man mano che l’adozione dei Web Services da puro strumento di interoperabilità si trasforma in una architettura adottando quei modelli architetturali che vanno sotto il nome di SOA, EDA, SaaS,... allora entriamo nella così detta &lt;b&gt;&lt;i&gt;Enterprise Agility&lt;/i&gt;&lt;/b&gt;. Ovvero adottando questi modelli rusciamo ad essere più reattivi alle richieste da parte del business perchè il nostro modello permette o dovrebbe permettere i principi dell’application composition. Bene! Tutto questo panegirico per dire che, una volta tanto, sono qui per parlare della parte di &lt;i&gt;Efficiency&lt;/i&gt; e non (solo) della &lt;i&gt;Agility&lt;/i&gt;. Infatti tramite le WWSAPI sarà possibile mettere in comunicazione i nostri applicativi unmanaged con servizi scritti con .NET, J2EE e tutti quei linguaggi capaci di gestire SOAP 1.1 o 1.2 e HTTP. In realtà le WWSAPI fanno molto di più : permettono l’integrazione degli applicativi anche in scenari complessi basati su stack WS-* !!!&lt;/p&gt;  &lt;p&gt;Ah, quasi dimenticavo, da una indagine svolta dalla società&amp;#160; PayScale pare che i programmatori C/C++ abbiano in media uno stipendio più alto dal 2 al 20 % rispetto ai colleghi .NET e Java !!! Programmatore avvisato … :-)&lt;/p&gt;  &lt;h3&gt;Perchè un’altra libreria?&lt;/h3&gt;  &lt;p&gt;Perchè le applicazioni unmanaged, essendo una forte realtà sul mercato hanno bisogno di uno stack snello e performante capace di integrare le applicazioni C/C++ con le funzionalità esposte dai Web Services.&amp;#160; Inoltre, non so voi, ma a me nel tempo è capitato spesso di vedere molte forme custom di integrazione alcune delle quali particolarmente fantasiose :-) Oramai i Web Services sono diventati una realtà non solo per le applicazioni utenti ma sempre più spesso anche da parte del Sistema Operativo. Quindi, chi meglio del S.O. può mettere a disposizione una libreria capace di “parlare Web Service”??&lt;/p&gt;  &lt;p&gt;Altra richiesta fondamentale è la &lt;b&gt;non dipendenza&lt;/b&gt; da altri stack tecnologici. Da anni si possono già integrare componenti .NET con codice C/C++ tramite ad esempio il Managed C++, pInvoke.... Tutte soluzioni però che vedono il caricamente del CLR all’interno dello spazio di indirizzamento del processo unamanged. Questo in molti casi è semplicemente non percorribile per motivi di performance, di security... Morale della favola : le WWSAPI non hanno alcuna dipendenza da altri stack tecnologici come COM, DCOM, .NET o altro... nemmeno ATL!!!! Sono delle semplici API esposte in un’unicqa DLL, WEBSERVICES.DLL, che non ha dipendenze particolari se non quelle classiche di sistema come ad esempio : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MSVCRT.DLL (Windows NT CRT)&lt;/li&gt;    &lt;li&gt;WS2_32.DLL (Windows Socket 2.0)&lt;/li&gt;    &lt;li&gt;HTTPAPI.DLL (HTTP Protocol Stack API)&lt;/li&gt;    &lt;li&gt;WINHTTP.DLL (Windows HTTP Services)&lt;/li&gt;    &lt;li&gt;CRYPT32.DLL (Prima di Vista)&lt;/li&gt;    &lt;li&gt;BCRYPT.DLL &amp;amp; NCRYPT.DLL (Da Vista in poi)&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Solo per Windows 7?&lt;/h3&gt;  &lt;p&gt;Trattandosi tipicamente di applicazioni C/C++ scritte negli anni non era pensabile che il S.O.di riferimento fosse solo ed unicamente Windows 7 e R2 di W2008. Per questo motivo le WWSAPI saranno disponibili anche per tutti i S.O. ancora coperti da supporto tecnico:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows XP con Service Pack 2 (SP2) e successivi&lt;/li&gt;    &lt;li&gt;Windows Vista&lt;/li&gt;    &lt;li&gt;Windows Server 2003 con Service Pack 2 (SP2) &lt;/li&gt;    &lt;li&gt;Windows Server 2003 R2 con Service Pack 2 (SP2) &lt;/li&gt;    &lt;li&gt;Windows Server 2008 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La domanda più ricorrente a questo punto è : &lt;em&gt;perchè non Windows 2000&lt;/em&gt;? Perchè ormai W2K è fuori dai cicli evolutivi e di supporto.&lt;/p&gt;  &lt;p&gt;Download delle varie versioni : &lt;a title="http://connect.microsoft.com/WNDP/content/content.aspx?ContentID=11205" href="http://connect.microsoft.com/WNDP/content/content.aspx?ContentID=11205"&gt;http://connect.microsoft.com/WNDP/content/content.aspx?ContentID=11205&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;WWSAPI e WCF che relazione?&lt;/h3&gt;  &lt;p&gt;nessuna :-) ormai dovrebbe essere chiaro. WWSAPI non hanno dipendenze con il framework .NET e quindi neppure con WCF. Sono due librerie paritetiche : WWSAPI utilizzate in codice unmanaged; WCF in codice managed! Condividono però una serie di similitudini come ad esempio il modello di programmazione &lt;i&gt;Function-oriented&lt;/i&gt; che permette di mascherare al programmatore i dettagli di una comunicazione message-oriented. Altra similitudine è il supporto a scenari più articolati come quelli previsti dallo stack di specifiche WS-* per i Web Services :&amp;#160; &lt;/p&gt;  &lt;p&gt;Specifiche di Base:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Trasporto&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;HTTP, TCP, UDP&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;XML Encoding&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Text, Binary, MTOM&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Metadata&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WSDL 1.1, XML Schema 1.0&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Envelop&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;SOAP 1.1 e SOAP 1.2&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Specifiche WS-*&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Addressing&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WS-Addressing 0.9 e 1.0&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Metadata&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WS-MetadataExchange 1.1&lt;/li&gt;      &lt;li&gt;WS-Transfer March 2006&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Security&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WS-Security 1.0 e 1.1 (implementazione parziale)&lt;/li&gt;      &lt;li&gt;WS-Trust February 2005 e 1.3 (implementazione parziale)&lt;/li&gt;      &lt;li&gt;WS-SecureConversation 1.1 e 1.3 (implementazione parziale)&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Policy&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WS-Policy dalla versione March 2006 alla 1.2&lt;/li&gt;      &lt;li&gt;WS-PolicyAttachment dalla versione March 2006 alla 1.2&lt;/li&gt;      &lt;li&gt;WS-SecurityPolicy 1.1&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Come si può notare a fianco delle specifiche di sicurezza c’è la scritta un po’ inquietante : &lt;i&gt;implementazione parziale&lt;/i&gt;. Questo significa che la versione 1.0 delle WWSAPI implementano solamente la sicurezza a livello di trasporto e &lt;i&gt;Mixed-mode Security &lt;/i&gt;escludendo di fatto quella parte delle specifiche relative alla sicurezza a livello di messaggio che al contrario è presente in WCF. Quindi riassumendo le caratteristiche del Channel Security avremo:&lt;/p&gt;  &lt;p&gt;Trasport Security:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HTTP : SSL e Header auth: basic/digest/SPNEGO/NTLM e SSPI &lt;/li&gt;    &lt;li&gt;TCP: Windows SSPI e SSL&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mixed-mode Security&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Il trasporto mette in sicurezza la connessione e fornisce la funzionalità di server authentication.&lt;/li&gt;    &lt;li&gt;Gli Header WS-Security all’interno dei messaggi SOAP vengono utilizzati per il client authentication:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Token : Username/Password, Kerberos AP_REQ, SCT, Generic XML&lt;/li&gt;      &lt;li&gt;Supporto a token SAML e scenari di Federation.&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h3&gt;   &lt;br /&gt;WWSAPI Architecture&lt;/h3&gt;  &lt;p&gt;Nella documentazione ancora in BETA ogni tanto si fa ancora riferimento alle WWSAPI con il codename Sapphire !&lt;/p&gt;  &lt;p&gt;Nella figura sottostante è schematizzata la struttura delle WWSAPI:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/LenuoveAPIWindowsWebServicesAPIdiWindows_101C6/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/LenuoveAPIWindowsWebServicesAPIdiWindows_101C6/image_thumb.png" width="429" height="192" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figura 1 : architettura delle WWSAPI&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Esistono una serie di oggetti trasversali ai layer come ad esempio &lt;em&gt;Errors&lt;/em&gt;, &lt;em&gt;Tracing&lt;/em&gt;, &lt;em&gt;Heap &lt;/em&gt;che permettono al programmatore di gestire facilmente alcuni aspetti della gestione delle WWSAPI. L’oggetto Error ad esempio permette di uniformare la gestione degli errori semplificando anche la complessità dei SOAP Faults mentre l’oggetto Heap permette di fare chiarezza su chi alloca e chi disalloca le risorse impiegate per la gestione delle comunicazioni. Maggiori informazioni sull’uso di questi oggetti e relative &lt;a href="http://msdn.microsoft.com/en-us/library/dd430435(VS.85).aspx" target="_blank"&gt;funzioni si trovano qui&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Come si può notare dalla figura 1 il codice applicativo può lavorare a diversi layer a seconda del livello di dettaglio che si vuole gestire direttamente. In due parole cercherò di descrivere i vari layer mentre una descrizione più esaustiva la si &lt;a href="http://msdn.microsoft.com/en-us/library/dd430451(VS.85).aspx" target="_blank"&gt;può trovare qui&lt;/a&gt; sul sito MSDN. &lt;/p&gt;  &lt;p&gt;Il &lt;strong&gt;Service Model &lt;/strong&gt;è il layer più ad alto livello che permette di gestire la comunicazione tra il client e il Web Service con il modello a chiamate a funzioni. Il punto di contatto tra il client e un Web Services anche per le WWSAPI è solo il WSDL e gli XSD che vengono trasformati in codice C (.c e .h) da una utility a riga di comando &lt;strong&gt;wsutil.exe (Maggiori dettagli nel prossimo post dove partiremo da zero nell’integrazione con dei Web Services).&lt;/strong&gt;     &lt;br /&gt;Lato client permette di chiamare delle funzioni proxy generate dal tool &lt;strong&gt;WSutil.exe &lt;/strong&gt;mentre lato server permette di concentrarsi quasi esclusivamente nell’implementazione delle funzioni di callback. &lt;/p&gt;  &lt;p&gt;Il &lt;strong&gt;Channel Layer &lt;/strong&gt;rappresenta una astrazione del canale di comunicazione e permette di interagire direttamente con le sue poprietà. A mio avviso non saranno molti gli scenari dove sarà richiesto l’accesso a questo livello di dettaglio.&lt;/p&gt;  &lt;p&gt;L’ XML Layer/Serialization rappresenta il proprio motore specializzato per i’ XML parsing delle WWSAPI con encoding Text, Binary e MTOM. Queste API esportano un XML Buffer, un XML Reader e un XML Writer che permettono di gestire, leggere e scrivere documenti XML solo in modalità “forward-only”. L’unica nota che mi preme sottolineare è il non supporto dei DTD come spesso avviene in scenari SOAP. Anche in questo caso a mio avviso saranno pochi gli scenari dove è richiesto un intervento a questo livello.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nel prossimo post vedremo come utilizzare queste API passo-passo in diversi scenari…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9503801" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx">C/C++</category></item><item><title>Come funzionano i Security Token Services.</title><link>http://blogs.msdn.com/mariofontana/archive/2008/09/29/come-funzionano-i-security-token-services.aspx</link><pubDate>Mon, 29 Sep 2008 09:10:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8968487</guid><dc:creator>mfontana</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/8968487.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=8968487</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://video.msn.com/video.aspx?vid=c6abdfaa-2606-4f09-bdb4-7aac0afdf1aa"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="256" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/4fdbf840291c_7231/image_5.png" width="394" align="left" border="0" /&gt;&lt;/a&gt; Oggi per la serie &lt;strong&gt;MSDN Talks&lt;/strong&gt; siamo in compagnia di &lt;strong&gt;Alessio Mannelli&lt;/strong&gt; - Senior Developer - della divisione Servizi di Microsoft Italia. Con Alessio negli anni passati abbiamo speso insieme parecchio tempo nella definizione e realizzazione di infrastrutture applicative (a partire da WSE 2.0) fino ad arrivare ai giorni pi&amp;#249; recenti con WCF (&lt;em&gt;WIndows Communicatino Foundation&lt;/em&gt;). &lt;a href="http://video.msn.com/video.aspx?vid=c6abdfaa-2606-4f09-bdb4-7aac0afdf1aa" target="_blank"&gt;In questo breve video&lt;/a&gt; Alessio ci parler&amp;#224; dei meccanismi di autenticazione tra servizi nei modelli definiti da WS-Security, WS-Trust e SAML 1.1. Particolare attenzione viene posta al concetto di Authority (detto anche STS - Security Token Service). Questa breve introduzione teorica sull'argoment&amp;#232; essenziale per capire scenari pi&amp;#249; complessi di Single-Sign-On in architetture SOA. Inoltre, i meccasismi spiegati da Alessio sono i medesimi che troviamo in tecnologie come ADFS (Active Directory Federation Services), CardSpace, nel nuovo &lt;em&gt;Zermatt &lt;/em&gt;(di cui parleremo a breve) e nelle future tecnologie che verranno presentati tra poco al PDC.&lt;/p&gt;  &lt;p&gt;L&amp;#8217;authority gestisce il riconoscimento dei chiamanti e la profilazione degli utenti sui servizi offrendo al sistema un punto centrale per la gestione delle politiche di sicurezza. Il chiamante prima di poter effettuare una richiesta al servizio deve autenticarsi presso l&amp;#8217;authority e farsi rilasciare un ticket di accesso al servizio richiesto. &lt;/p&gt;  &lt;p&gt;L&amp;#8217;autenticazione presso l&amp;#8217;authority avviene mediante l&amp;#8217;invio dell'identit&amp;#224; del servizio client che pu&amp;#242; essere espressa sotto varie forme: credenziali di rete, credenziali custom, certificati X509 oppure &lt;i&gt;Ticket Granting Ticket&lt;/i&gt; (TGT) preventivamente rilasciati dalla stessa authority.&lt;/p&gt;  &lt;p&gt;Alessio, ci parler&amp;#224; prevalentemente del modello di autenticazione di un servizio tramite certificati X509. L&amp;#8217;utilizzo di certificati X509 consente di realizzare un&amp;#8217;infrastruttura di sicurezza basata su algoritmi asimmetrici che utilizzano chiavi pubbliche e private per firmare e criptare le comunicazioni verso l&amp;#8217;authority.&lt;/p&gt;  &lt;p&gt;Lo scenario basato sull&amp;#8217;utilizzo di certificati X509 richiede la presenza di una Certification Authority (interna o esterna all'azienda) riconosciuta da tutte le entit&amp;#224; dell&amp;#8217;infrastruttura che rilascia certificati X509 per l&amp;#8217;identificazione dei vari attori e per l&amp;#8217;utilizzo degli algoritmi di crittografia e firma. Ad ogni componente (chiamante, servizio e authority) &amp;#232; associato uno specifico certificato. La specifica WS-Trust definisce come i servizi in gioco possano autenticarsi tra loro. Riassumento lo scenario descritto da Alessio avremo : &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/4fdbf840291c_7231/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/4fdbf840291c_7231/image_thumb_1.png" width="398" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;1) il servizio/applicazione chiamante si autentica all'authority via X509. In questo contesto la specifica WS-TRust definisce un tipo di messaggio chiamato RST (Request Security Token). &lt;/p&gt;  &lt;p&gt;2) l'authority autentica il servizio/applicazione client, verifica le policy autorizzative e crea un nuovo security token di tipo SAML che descrive l'identity del client ed eventuali informazioni aggiuntive sui ruoli e applicative.In questo contesto la specifica WS-TRust definisce un tipo di messaggio chiamato RSTR (Request Security Token &lt;strong&gt;Response&lt;/strong&gt;). &lt;/p&gt;  &lt;p&gt;3) Il chiamante passa il security token di tipo SAML al servizio target che pu&amp;#242; effettuare la verifica dell' identit&amp;#224; del client e procedere all'esecuzione del processo di business.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Buona visione&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8968487" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Webcast/default.aspx">Webcast</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/IDentity+Metasystem/default.aspx">IDentity Metasystem</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/MSDN+Talks/default.aspx">MSDN Talks</category></item><item><title>Il materiale dell' Architect Insight Conferenze</title><link>http://blogs.msdn.com/mariofontana/archive/2008/05/19/il-materiale-dell-architect-insight-conferenze.aspx</link><pubDate>Mon, 19 May 2008 17:59:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8519118</guid><dc:creator>mfontana</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/8519118.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=8519118</wfw:commentRss><description>&lt;p&gt;Il 28 e 29 Aprile si &amp;#232; svolto l' &lt;strong&gt;Architect Insight Conference &lt;/strong&gt;in una stupenda cornice bucolica very british :-) appena fuori Londra. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ArchitectInsightConferenze.ilmateriale_F716/DSCF0160_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="276" alt="DSCF0160" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ArchitectInsightConferenze.ilmateriale_F716/DSCF0160_thumb.jpg" width="366" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ArchitectInsightConferenze.ilmateriale_F716/DSCF0162_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="280" alt="DSCF0162" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ArchitectInsightConferenze.ilmateriale_F716/DSCF0162_thumb.jpg" width="372" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Per me &amp;#232; stata l'occasione di rivedere alcuni colleghi ed amici... immersi nel verde :-)... ma lontani dai pub... :-( &lt;/p&gt;  &lt;p&gt;La conferenza dedicata a &lt;strong&gt;Senior Architects&lt;/strong&gt;, &lt;strong&gt;CTOs &lt;/strong&gt;e &lt;strong&gt;decision makers &lt;/strong&gt;quest'anno &amp;#232; stata suddivisa in quattro focalizzazioni : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Enterprise Architecture &lt;/li&gt;    &lt;li&gt;Infrastructure Architecture &lt;/li&gt;    &lt;li&gt;Solution Architecture &lt;/li&gt;    &lt;li&gt;Software plus Services. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Lato sicurezza consiglio di visionare le presentazioni di &lt;strong&gt;Steve Plank &lt;/strong&gt;(ottimo speaker) su:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;a href="http://download.microsoft.com/documents/uk/msdn/events/INF/INF04.pptx" target="_blank"&gt;A Claims Based Identity System&lt;/a&gt; &lt;/strong&gt;dove tratta i concetti di base che hanno portato alla definizione dell' Identity Metasystem.&lt;strong&gt;&amp;#160;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;a href="http://download.microsoft.com/documents/uk/msdn/events/INF/INF06.pptx" target="_blank"&gt;Whiteboard discussion of WS-Federation e WS-Trust&lt;/a&gt;&lt;/strong&gt;. Questa sessione non &amp;#232; proprio introduttiva per&amp;#242; permette di capire il flusso dei messaggi definiti dalle due specifiche. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La sessione di &lt;strong&gt;Benjamin Ravani &lt;/strong&gt;(GM diGlobal Foundation Services) : &lt;strong&gt;&lt;a href="http://download.microsoft.com/documents/uk/msdn/events/Keynote/KEY%2003.pptx" target="_blank"&gt;Building Resilient Web Services&lt;/a&gt; &lt;/strong&gt;invece riporta alcune interessanti considerazioni sulle sicurezza e disponibilit&amp;#224; di servizi su Internet anche se da un'occhio prettamente sistemistico.&lt;/p&gt;  &lt;p&gt;Infine, segnalo la sessione di &lt;strong&gt;Steve Lamb &lt;/strong&gt;su &lt;strong&gt;&lt;a href="http://download.microsoft.com/documents/uk/msdn/events/INF/INF03.pptx" target="_blank"&gt;Security Management for Dynamic virtual systems with Server 2008 and System Center&lt;/a&gt; &lt;/strong&gt;per capire i principali rischi di sicurezza (e non solo) legate all'introduzione della virtualization all'interno delle nostre infrastrutture applicative.&lt;/p&gt;  &lt;p&gt;L'intero materiale lo potete trovare sul sito di &lt;a href="http://msdn.microsoft.com/en-gb/architecture/cc531255.aspx" target="_blank"&gt;Microsoft UK&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8519118" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Software+Plus+Services/default.aspx">Software Plus Services</category></item><item><title>Progetto : WCF Security</title><link>http://blogs.msdn.com/mariofontana/archive/2008/04/11/progetto-wcf-security.aspx</link><pubDate>Fri, 11 Apr 2008 16:00:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8376434</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/8376434.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=8376434</wfw:commentRss><description>&lt;p&gt;Su CodePlex &amp;#232; nato &lt;a href="http://www.codeplex.com/WCFSecurity" target="_blank"&gt;questo&lt;/a&gt; nuovo interessantissimo progetto di &lt;em&gt;Patterns and Practices&lt;/em&gt; dedicato a &lt;strong&gt;WCF&lt;/strong&gt; (Windows Communication Foundation) e la sicurezza. Una delle novit&amp;#224; che ho maggiormente apprezzato &amp;#232; la suddivisione in scenari e relativa documentazione in stile how-to in modo da essere quanto pi&amp;#249; veloci nell'adattare le proprie soluzioni secondo queste best practices di sicurezza.&lt;/p&gt;  &lt;p&gt;Sono disponibili anche vari video. Il progetto &amp;#232; appena iniziato e quindi manca ancora di molte parti essenziali ma &amp;#232; solo questione di tempo...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Alcune curiosit&amp;#224;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La struttura di questo progetto nasce da un lavoro pubblicato ormai nel lontano &lt;strong&gt;28 maggio 2004&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ProgettoWCFSecurity_13F30/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ProgettoWCFSecurity_13F30/image_thumb.png" width="201" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Il focus di questo &lt;strong&gt;BIGINO &lt;/strong&gt;(&lt;strong&gt;919 pagine&lt;/strong&gt;) era l'architettura e l'implementazione di soluzione Web (pi&amp;#249;) sicure con &lt;strong&gt;.NET 1.1. &lt;/strong&gt;Le tecnologie toccate quindi erano ASP.NET, CAS, Enterprise Services (COM+), Web Services, Remoting e data access. Il tomo era fatto bene ed entrava nei dettagli delle singole configurazioni suddivise per scenari (internet , intranet).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Gli anni passano e il &lt;strong&gt;7 Agosto 2007&lt;/strong&gt; abbiamo un nuovo libro sulla sicurezza delle applicazioni incentrato questa volta solo sui Web Services con l'allora mitico &lt;strong&gt;WSE 3.0 &lt;/strong&gt;(&lt;em&gt;Web Services Enhancement &lt;/em&gt;- nome in codice &lt;em&gt;WSDK Web Services SDK&lt;/em&gt;). sottolineao la versione 3.0, l'unica compatibile a livello di specifiche (non sempre per&amp;#242; :-)) con WCF.. Era la &lt;strong&gt;Web Service Security Guide&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ProgettoWCFSecurity_13F30/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/ProgettoWCFSecurity_13F30/image_thumb_1.png" width="202" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Anche in questo caso abbiamo la suddivisione in scenari (molto pi&amp;#249; articolati rispetto al precedente)...L'unico problema di questo &lt;strong&gt;MINI BIGINO&lt;/strong&gt; (&lt;strong&gt;solo 359 pagine&lt;/strong&gt;) fa dei ragionamenti su un modello di programmazione basato su WSE che a livello architetturale &amp;#232; molto diverso da WCF...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;cosa manca al nuovo lavoro?? Beh, una copertina :-)&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8376434" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category></item><item><title>Autenticazione nelle comunicazioni : sicurezza a livello di canale</title><link>http://blogs.msdn.com/mariofontana/archive/2008/03/29/autenticazione-nelle-comunicazioni-sicurezza-a-livello-di-canale.aspx</link><pubDate>Sat, 29 Mar 2008 14:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8343335</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/8343335.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=8343335</wfw:commentRss><description>&lt;p&gt;Quando ci troviamo a progettare la forma di autenticazione nelle architetture Service-Oriented dobbiamo considerare vari aspetti relativi allo scenario. &lt;/p&gt;  &lt;p&gt;L&amp;#8217;identificazione dell&amp;#8217;utente che sta compiendo una determinata operazione &amp;#232; alla base di ogni sistema di sicurezza. &lt;/p&gt;  &lt;p&gt;Indipendente dal modello di autenticazione utilizzato, il processo di riconoscimento dell&amp;#8217;utente prevede la definizione di un protocollo di autenticazione end to end tra i vari (spesso due, ma non &amp;#232; detto) attori della comunicazione a livello di sistema o applicativo per garantire il riconoscimento dell&amp;#8217;utente. Il protocollo di autenticazione definisce, quindi, le modalit&amp;#224; con le quali il servizio riconosce il chiamante. &lt;/p&gt;  &lt;p&gt;Una comunicazione tra due servizi (end to end) costituisce l&amp;#8217;elemento base della classica catena di chiamate a cascata tipiche degli scenari complessi. Una volta stabilite le modalit&amp;#224; di autenticazione, il processo di riconoscimento dell&amp;#8217;utente deve implementare un ben determinato modello di autenticazione per consentire al servizio chiamato di ottenere il corretto contesto di sicurezza (&lt;strong&gt;security context&lt;/strong&gt;) del chiamante, indipendentemente dal flusso di chiamate e dalla posizione del servizio all&amp;#8217;interno della catena di chiamate stesse. Al servizio chiamato a sua volta pu&amp;#242; utilizzare nel modo corretto le informazioni messe a disposizione dal modello utilizzato per realizzare le politiche di sicurezza necessarie.&lt;/p&gt;  &lt;p&gt;Le modalit&amp;#224; di autenticazione, come detto, definiscono il protocollo con cui il chiamante fornisce al servizio le informazioni di sicurezza per il riconoscimento dell&amp;#8217;utente. La scelta della modalit&amp;#224; di autenticazione da utilizzare &amp;#232; condizionata da vari fattori: tipo di applicazioni, modalit&amp;#224; di colloqui tra chiamante e servizio, piattaforma utilizzata,&amp;#8230;.Le modalit&amp;#224; di autenticazione offrono caratteristiche diverse dipendenti dal livello a cui vengono implementate. In generale esistono tre grandi famiglie di modalit&amp;#224; di autenticazione:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;a livello di canale di comunicazione.&lt;/li&gt;    &lt;li&gt;a livello applicativo.&lt;/li&gt;    &lt;li&gt;a livello di messaggio (anche di infrastruttura applicativa).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Sicurezza a livello di canale&lt;/h2&gt;  &lt;p&gt;La modalit&amp;#224; basata sulla sicurezza a livello di canale di comunicazione utilizza il canale di trasporto tra i due end point della comunicazione, per lo scambio delle informazioni necessarie al riconoscimento dell&amp;#8217;utente.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Autenticazionenellecomunicazionisicurezz_B0A4/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="239" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Autenticazionenellecomunicazionisicurezz_B0A4/image_thumb.png" width="436" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Figura 1: modelli di autenticazione a livello di canale di comunicazione&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Il protocollo di autenticazione utilizzato in questo caso &amp;#232; strettamente dipendente sia dal canale di comunicazione utilizzato che dalla sicurezza supportata dalla piattaforma. &lt;/p&gt;  &lt;p&gt;L&amp;#8217;autenticazione &amp;#232;, quindi, trasparente alle applicazioni e configurata a livello di sistema in moda da consentire al chiamante e servizio di instaurare il corretto protocollo per lo scambio delle informazioni.&lt;/p&gt;  &lt;p&gt;I vantaggi di questa modalit&amp;#224; sono essenzialmente nella semplicit&amp;#224; di utilizzo (da parte delle applicazioni) e nella sicurezza offerta, definita dallo stesso canale di comunicazione utilizzato. &lt;/p&gt;  &lt;p&gt;Di contro, per&amp;#242; la sicurezza di canale, avendo come unica granularit&amp;#224; applicabile l&amp;#8217;intero messaggio, &amp;#232; molto rigida e non consente di applicare politiche di sicurezza su singole porzioni di messaggio.&lt;/p&gt;  &lt;h3&gt;Quando usarla&lt;/h3&gt;  &lt;p&gt;La modalit&amp;#224; di autenticazione a livello di canale (trasporto) &amp;#232; semplice e generalmente adeguata in scenari dove i meccanismi di trasporto e i partner della comunicazione sono fortemente controllati. &lt;/p&gt;  &lt;p&gt;I maggiori vincoli sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;basando tutto a livello di trasporto, l&amp;#8217;autenticazione &amp;#232; fortemente dipendente dalla piattaforma utilizzata e dai servizi di sicurezza forniti da questa,&lt;/li&gt;    &lt;li&gt;l&amp;#8217;autenticazione non dipende dalla tipologia di messaggio/richiesta effettuata, non entra nel merito del formato, dei dati e non distingue singole porzioni di messaggio, &lt;/li&gt;    &lt;li&gt;l&amp;#8217;autenticazione &amp;#232; applicata agli end point della comunicazione senza la possibilit&amp;#224; (se non supportata dai meccanismi di sicurezza della piattaforma utilizzata) di fluire in una catena di richieste e tra intermediari.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nel prossimo post analizzeremo l'autenticazione a livello applicativo....&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="5"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8343335" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/SOA/default.aspx">SOA</category></item><item><title>Le specifiche di XAML</title><link>http://blogs.msdn.com/mariofontana/archive/2008/03/28/le-specifiche-di-xaml.aspx</link><pubDate>Fri, 28 Mar 2008 21:34:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8342207</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/8342207.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=8342207</wfw:commentRss><description>&lt;p&gt;Lo XAML (Microsoft Extensible Application Markup Language) rappresenta un po' la lingua franca basata su XML di varie tecnologie MS come &lt;em&gt;WPF &lt;/em&gt;(Windows Presentation Foundation), &lt;em&gt;WF &lt;/em&gt;(Workflow Foundation) e &lt;em&gt;Silverlight&lt;/em&gt;.Infatti lo XAML &amp;#232; un XML document type per l'organizzazione di dati generati dai vari runtime. &lt;/p&gt;  &lt;p&gt;Da qualche giorno sono disponibili &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3356AF19-A36E-4D6D-9D13-C37DB81EE607&amp;amp;displaylang=en" target="_blank"&gt;alcune specifiche dello XAML&lt;/a&gt;. Questi primi documenti parlano dello &lt;em&gt;Xaml Object Mapping&lt;/em&gt; con particolare focus sul &lt;em&gt;data model for Types &lt;/em&gt;e &lt;em&gt;object hierarchies &lt;/em&gt;pi&amp;#249; vari tecniche per il mapping. Certo non &amp;#232; una lettura tipica da &amp;quot;comodino&amp;quot; per&amp;#242; &amp;#232; importante per architetti e sviluppatori pi&amp;#249; senior (che gi&amp;#224; hanno esperienza di XAML) per capire meglio come funzionano gli internals di questa specifica che sta diventando sempre pi&amp;#249; centrale in molte tecnologie Microsoft.&lt;/p&gt;  &lt;p&gt;Anche in questo caso le specifiche sono state rilasciate sotto la &lt;a href="http://www.microsoft.com/interop/osp/default.mspx" target="_blank"&gt;Microsoft Open Specificiation Promise&lt;/a&gt; che di fatto permette di utilizzare liberamente queste specifiche all'interno dei propri prodotti.&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8342207" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/.net+framework/default.aspx">.net framework</category></item><item><title>Specifiche di base: XML Encryption in pillole...</title><link>http://blogs.msdn.com/mariofontana/archive/2007/11/22/specifiche-di-base-xml-encryption-in-pillole.aspx</link><pubDate>Thu, 22 Nov 2007 13:52:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6468657</guid><dc:creator>mfontana</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/6468657.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=6468657</wfw:commentRss><description>&lt;p&gt;La specifica XML Encryption [&lt;i&gt;XMLENC xmlns:xenc='http://www.w3.org/2001/04/xmlenc#'&lt;/i&gt; ] ha il compito di definire la sintassi e il processo per cifrare dei dati binari o testuali e rappresentarli in formato XML. La struttura XML della specifica si basa sull’elemento &lt;i&gt;EncryptedData&lt;/i&gt; : &lt;pre class="code"&gt;&amp;lt;EncryptedData Id? Type? MimeType? Encoding?&amp;gt;
    &amp;lt;EncryptionMethod/&amp;gt;?
    &amp;lt;ds:KeyInfo&amp;gt;
      &amp;lt;EncryptedKey&amp;gt;?
      &amp;lt;AgreementMethod&amp;gt;?
      &amp;lt;ds:KeyName&amp;gt;?
      &amp;lt;ds:RetrievalMethod&amp;gt;?
      &amp;lt;ds:*&amp;gt;?
    &amp;lt;/ds:KeyInfo&amp;gt;?
    &amp;lt;CipherData&amp;gt;
      &amp;lt;CipherValue&amp;gt;?
      &amp;lt;CipherReference URI?&amp;gt;?
    &amp;lt;/CipherData&amp;gt;
    &amp;lt;EncryptionProperties&amp;gt;?
  &amp;lt;/EncryptedData&amp;gt;
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;il quale può contenere o referenziare il documento cifrato (o ciphertext) permettendo due modalità diverse di rappresentazione : &lt;i&gt;Enveloping &lt;/i&gt;e &lt;i&gt;Detached&lt;/i&gt;. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLEncryptioninpillole_D668/Figura7.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="383" alt="Figura7" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLEncryptioninpillole_D668/Figura7_thumb.jpg" width="511" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Nel primo caso è presente l’elemento &lt;i&gt;CipherValue&lt;/i&gt; che contiene il ciphertext espresso in Base64 mentre nel secondo caso l’elemento &lt;i&gt;CipherReference&lt;/i&gt; punta ad una locazione dove è presente il ciphertext. In questo caso è stato utilizzato il termine &lt;i&gt;Detached&lt;/i&gt; &lt;i&gt;encryption &lt;/i&gt;e non &lt;i&gt;Enveloped encryption &lt;/i&gt;perchè in crittografia &lt;i&gt;Enveloped encryption &lt;/i&gt;ha un significato diverso. Infatti &lt;i&gt;Enveloped Encryption&lt;/i&gt; viene utilizzato per definire una operazione di cifratura un pò più complessa. Il testo in chiaro (o plaintext) viene cifrato con una chiave simmetrica (detta di sessione) generando un ciphertext. La chiave di sessione appena utilizzata (e generata) per l’encryption viene cifrata a sua volta da un’altra chiave (asimmetrica). La cifratura della chiave di sessione avviene tramite la chiave pubblica del destinatario (inteso come l’entità che deve decifrare il messaggio). Il ciphertext e la chiave di sessione cifrata devono essere presenti entrambi durante la fase di decryption possibile solo dal possessore della chiave privata associata. &lt;/p&gt;
&lt;p&gt;&lt;i&gt;EncryptionMethod&lt;/i&gt; è un elemento opzionale che indica quale algoritmo crittografico è stato utilizzato per le operazioni di cifratura. Nel caso questo elemento non fosse presente, il compito di ottenere tali informazioni è demandato al livello applicativo. In &lt;b&gt;tabella 1&lt;/b&gt; è presente uno schema riassuntivo degli algoritmi supportati dalla specifica. 
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLEncryptioninpillole_D668/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="421" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLEncryptioninpillole_D668/image_thumb.png" width="513" align="left" border="0"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;&lt;br&gt;&lt;br&gt;Tabella 1.&lt;/strong&gt;
&lt;p&gt;L’elemento &lt;i&gt;KeyInfo&lt;/i&gt; serve per rappresentare le informazioni inerenti le chiavi di cifratura. Si noti che tale elemento è preceduto dal namespace &lt;i&gt;ds&lt;/i&gt; (&lt;i&gt;xmlns:ds='http://www.w3.org/2000/09/xmldsig#&lt;/i&gt;) della specifica [XMLDSIG]. Questo indica che le regole riguardanti questo elemento appartengono alla specifica di firma digitale. Per un maggiore dettaglio sull’argomento consultare la specifica [XMLDSIG] mentre per le possibili estensioni consultare la specifica [XMLENC]. 
&lt;p&gt;Un ’estensione importante è data dall’elemento &lt;i&gt;EncryptedKey&lt;/i&gt;. &lt;pre class="code"&gt;&amp;lt;element name=&lt;span style="color: rgb(163,21,21)"&gt;'EncryptedKey'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:EncryptedKeyType'&lt;/span&gt;/&amp;gt;
  &amp;lt;complexType name=&lt;span style="color: rgb(163,21,21)"&gt;'EncryptedKeyType'&lt;/span&gt;&amp;gt;
    &amp;lt;complexContent&amp;gt;
      &amp;lt;extension &lt;span style="color: rgb(0,0,255)"&gt;base&lt;/span&gt;=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:EncryptedType'&lt;/span&gt;&amp;gt;
        &amp;lt;sequence&amp;gt;
          &amp;lt;element &lt;span style="color: rgb(0,0,255)"&gt;ref&lt;/span&gt;=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:ReferenceList'&lt;/span&gt; minOccurs=&lt;span style="color: rgb(163,21,21)"&gt;'0'&lt;/span&gt;/&amp;gt;
          &amp;lt;element name=&lt;span style="color: rgb(163,21,21)"&gt;'CarriedKeyName'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'string'&lt;/span&gt; minOccurs=&lt;span style="color: rgb(163,21,21)"&gt;'0'&lt;/span&gt;/&amp;gt;
        &amp;lt;/sequence&amp;gt;
        &amp;lt;attribute name=&lt;span style="color: rgb(163,21,21)"&gt;'Recipient'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'string'&lt;/span&gt; use=&lt;span style="color: rgb(163,21,21)"&gt;'optional'&lt;/span&gt;/&amp;gt;
      &amp;lt;/extension&amp;gt;
    &amp;lt;/complexContent&amp;gt;   
  &amp;lt;/complexType&amp;gt;
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Tale elemento viene impiegato per la distribuzione delle chiavi simmetriche tramite il pattern definito in &lt;i&gt;Enveloped Encryption&lt;/i&gt;, dove la chiave simmetrica viene cifrata per ogni destinatario con un’altra chiave (chiave pubblica). &lt;i&gt;EncryptedKey&lt;/i&gt; può essere inserito come figlio di &lt;i&gt;ds:KeyInfo&lt;/i&gt;, come documento XML disgiunto, oppure come elemento all’interno dello stesso documento XML contenente un &lt;i&gt;ds:KeyInfo&lt;/i&gt;. 
&lt;p&gt;Il sottoelemento opzionale &lt;i&gt;ReferenceList&lt;/i&gt; indica quali chiavi simmetriche sono state cifrate mentre &lt;i&gt;CarriedKeyName&lt;/i&gt; e &lt;i&gt;Recipient&lt;/i&gt; danno ulteriori informazioni al contesto applicativo per individuare la chiave di cifratura. 
&lt;p&gt;L’elemento &lt;i&gt;CipherData&lt;/i&gt; è un dato obbligatorio e referenzia o contiene il ciphertext che sostituisce l’informazione in chiaro. Lo schema di &lt;i&gt;CipherData&lt;/i&gt; indica che sono possibili due valori : &lt;i&gt;CipherValue &lt;/i&gt;e &lt;i&gt;CipherReference&lt;/i&gt; &lt;pre class="code"&gt;&amp;lt;element name=&lt;span style="color: rgb(163,21,21)"&gt;'CipherData'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:CipherDataType'&lt;/span&gt;/&amp;gt;
  &amp;lt;complexType name=&lt;span style="color: rgb(163,21,21)"&gt;'CipherDataType'&lt;/span&gt;&amp;gt;
     &amp;lt;choice&amp;gt;
       &amp;lt;element name=&lt;span style="color: rgb(163,21,21)"&gt;'CipherValue'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'base64Binary'&lt;/span&gt;/&amp;gt;
       &amp;lt;element &lt;span style="color: rgb(0,0,255)"&gt;ref&lt;/span&gt;=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:CipherReference'&lt;/span&gt;/&amp;gt;
     &amp;lt;/choice&amp;gt;
   &amp;lt;/complexType&amp;gt;
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;L’elemento &lt;i&gt;CipherValue&lt;/i&gt; rappresenta il ciphertext in formato Base64 mentre &lt;i&gt;CipherReference&lt;/i&gt; è un riferimento al ciphertext puntato tramite l’attributo URI. &lt;pre class="code"&gt;&amp;lt;element name=&lt;span style="color: rgb(163,21,21)"&gt;'CipherReference'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:CipherReferenceType'&lt;/span&gt;/&amp;gt;
   &amp;lt;complexType name=&lt;span style="color: rgb(163,21,21)"&gt;'CipherReferenceType'&lt;/span&gt;&amp;gt;
       &amp;lt;sequence&amp;gt;
         &amp;lt;element name=&lt;span style="color: rgb(163,21,21)"&gt;'Transforms'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'xenc:TransformsType'&lt;/span&gt; minOccurs=&lt;span style="color: rgb(163,21,21)"&gt;'0'&lt;/span&gt;/&amp;gt;
       &amp;lt;/sequence&amp;gt;
       &amp;lt;attribute name=&lt;span style="color: rgb(163,21,21)"&gt;'URI'&lt;/span&gt; type=&lt;span style="color: rgb(163,21,21)"&gt;'anyURI'&lt;/span&gt; use=&lt;span style="color: rgb(163,21,21)"&gt;'required'&lt;/span&gt;/&amp;gt;
   &amp;lt;/complexType&amp;gt;

   &amp;lt;complexType name=&lt;span style="color: rgb(163,21,21)"&gt;'TransformsType'&lt;/span&gt;&amp;gt;
      &amp;lt;sequence&amp;gt;
        &amp;lt;element &lt;span style="color: rgb(0,0,255)"&gt;ref&lt;/span&gt;=&lt;span style="color: rgb(163,21,21)"&gt;'ds:Transform'&lt;/span&gt; maxOccurs=&lt;span style="color: rgb(163,21,21)"&gt;'unbounded'&lt;/span&gt;/&amp;gt; 
      &amp;lt;/sequence&amp;gt;
   &amp;lt;/complexType&amp;gt;
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Anche in questo caso, come in [XMLDSIG] è possibile effettuare delle trasformazioni per processare i dati. Le operazioni di trasformazione però sono state concepite in modo diverso rispetto alla specifica di firma digitale. Infatti in [XMLDSIG] il processo di generazione e di validazione utilizza sempre gli stessi dati di input (sempre il plaintext) ed applica le trasformazioni nello stesso ordine.Vicecersa, in [XMLENC], le operazioni di cifratura e decifratura partono da input diversi (rispettivamente il plaintext e il ciphertext) e la specifica indica che l’ordine in cui sono impostate le trasformazioni sono da intendersi solo per l’operazione di decifratura. Questo significa che durante la fase di cifratura le operazioni vengono svolte nell’ordine inverso. A causa di queste diversità il sottoelemento &lt;i&gt;Transforms&lt;/i&gt; è definito all’interno del namespace di [XMLENC]. 
&lt;p&gt;Infine l’ultimo elemento opzionale di EncryptedData è &lt;i&gt;EncryptionProperties&lt;/i&gt; che rappresenta un insieme di informazioni aggiuntive per l’applicazione di decrypt come ad esempio il timestamp o informazioni rigurdanti device crittografici o settaggi software per la decifratura. 
&lt;p&gt;In seguito sono riportati alcuni esempi di applicazione , tratti dalla specifica, di questa RFC a porzioni di documenti XML:
&lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; Informazione in chiaro&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;PaymentInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://example.org/paymentv2&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;John Smith&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CreditCard&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Limit&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;5,000&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Currency&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;USD&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Number&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;4019 2445 0277 5567&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Number&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Issuer&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;Example Bank&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Issuer&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Expiration&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;04/02&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Expiration&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CreditCard&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;PaymentInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; Cifratura dell'elemento CreditCard&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;--&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;PaymentInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://example.org/paymentv2&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;John Smith&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;EncryptedData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2001/04/xmlenc#Element&lt;/span&gt;'&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2001/04/xmlenc#&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;A23B45C56&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;EncryptedData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;PaymentInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; Cifratura di parte del contenuto dell' elemento CreditCard&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;--&amp;gt;&lt;br&gt;&amp;nbsp; &lt;br&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;PaymentInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://example.org/paymentv2&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;John Smith&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CreditCard&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Limit&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;5,000&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Currency&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;USD&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;EncryptedData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2001/04/xmlenc#&lt;/span&gt;'&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Type&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2001/04/xmlenc#Content&lt;/span&gt;'&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;A23B45C56&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;EncryptedData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;CreditCard&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;PaymentInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#000000"&gt;Esempio di cifratura secondo il pattern Enveloped Encryption. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;S:Envelope
&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns:S&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2001/12/soap-envelope&lt;/span&gt;"
&lt;span style="color: rgb(0,0,255)"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns:ds&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2000/09/xmldsig#&lt;/span&gt;"
&lt;span style="color: rgb(0,0,255)"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns:wsse&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;http://schemas.xmlsoap.org/ws/2002/04/secext&lt;/span&gt;"
&lt;span style="color: rgb(0,0,255)"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;xmlns:xenc&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;http://www.w3.org/2001/04/xmlenc#&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;S:Header&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;wsse:Security&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:EncryptedKey&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:EncryptionMethod&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Algorithm&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;...&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;ds:KeyInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;ds:KeyName&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;CN=Mario Fontana, C=IT&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;ds:KeyName&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;ds:KeyInfo&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;...&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:ReferenceList&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:DataReference&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;URI&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;#bodyID&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;/&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:ReferenceList&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:EncryptedKey&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;wsse:Security&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;S:Header&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;S:Body&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:EncryptedData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;/span&gt;&lt;span style="color: rgb(255,0,0)"&gt;Id&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;=&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;bodyID&lt;/span&gt;"&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;&lt;/span&gt;...&lt;span style="color: rgb(0,0,255)"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherValue&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:CipherData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;xenc:EncryptedData&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;S:Body&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163,21,21)"&gt;S:Envelope&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;font color="#000000"&gt;Il documento XML è formato dall’elemento &lt;em&gt;xenc:EncryptedKey &lt;/em&gt;il quale contiene le informazioni sulle chiavi simmetriche e asimmetriche e un secondo elemento &lt;em&gt;xenc:EncrytpedData &lt;/em&gt;contenente il ciphertext dei dati applicativi. Vediamo durante le due fasi (encryption e decryption) quali sono i passi che un’applicazione deve seguire: nella fase di creazione del documento XML l’applicazione genera una chiave di sessione SK1 che utilizza per cifrare le informazioni sensibili creando l’elemento xenc:EncryptedData che sostituisce al plaintext. A questo punto determina il destinatario del messaggio secondo la propria logica applicativa e utilizza la relativa chiave pubblica per cifrare SK1 che, in formato cifrato, viene inserita in xenc:CipherValue e imposta l’URI in xenc:DataReference per associare i dati cifrati con la chiave di sessione. Successivamente l’applicazione crea l’elemento ds:KeyInfo che tramite il sottoelemento ds:KeyName inserisce una stringa (“CN = Mario Fontana, C=IT”) che l’applicazione utilizzerà per iniziare il processo di decifratura tramite l’uso della corrispettiva chiave privata. In fase di decifratura l’applicazione, partendo dalla stringa in ds:KeyName, accede alla chiave privata e decifra il contenuto in xenc:CipherValue. Tale contenuto è la chiave di sessione SK1 che verrà utilizzata per decifrare la porzione XML referenziata da xenc:DataReference (in questo caso “#bodyID”) che punta ovviamente ad un blocco xenc:EncryptedData. Con questo meccanismo è possibile risolvere il problema della cifratura di informazioni applicative oltre al problema della distribuzione delle chiavi.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6468657" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category></item><item><title>Specifiche di base : XML Digital Signature in pillole...</title><link>http://blogs.msdn.com/mariofontana/archive/2007/10/30/specifiche-di-base-xml-digital-signature-in-pillole.aspx</link><pubDate>Tue, 30 Oct 2007 17:22:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5781116</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/5781116.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=5781116</wfw:commentRss><description>&lt;p&gt;Per chi di voi ha partecipato al &lt;a href="http://blogs.msdn.com/mariofontana/archive/2007/10/19/panel-security-al-wpc-2007-soa-e-sicurezza-applicativa-le-sfide-di-oggi-e-di-domani.aspx" target="_blank"&gt;Panel della sicurezza&lt;/a&gt; che ho tenuto a WPC 2007 (&lt;a href="http://blogs.msdn.com/mariofontana/archive/2007/10/27/slides-del-panel-sicurezza-a-wpc-2007.aspx" target="_blank"&gt;o letto le slides&lt;/a&gt;) può capire il perchè sto scrivendo questa serie di post... "in pillole". Infatti per comprendere completamente alcuni nuovi attacchi sul fronte XML/Web Services è necessario approfondire il funzionamento di alcune specifiche di sicurezza nel mondo XML, perciò... eccoci qua :-)&lt;/p&gt; &lt;p&gt;XML Digital Signature [XMLDSIG&amp;nbsp; xmlns="&lt;a href="http://www.w3.org/2000/09/xmldsig#&amp;quot;]"&gt;http://www.w3.org/2000/09/xmldsig#"]&lt;/a&gt; è il risultato di un lavoro congiunto tra il W3C e IETF. Lo scopo di questa specifica è di definire una sintassi XML e un insieme di regole per la creazione, la rappresentazione e la verifica di una o più firme digitali generate da documenti binari o XML. Al contrario XMLDSIG non si occupa del problema della generazione delle chiavi crittografiche, dell’associazione di tali chiavi ad utenti, servizi o processi e dei lagami di trust che devono essere impostati tra chi firma e chi verifica. Questa scelta permette di evidenziare la differenza tra le operazioni crittografiche e le policy di validazione che possono cambiare a seconda dello scenario applicativo.&lt;br&gt;La specifica prevede tre modalità per applicare le firme digitali in un formato XML: &lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Enveloped&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Enveloping&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Detached&lt;/strong&gt;. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLDigitalSignatureinpi_BD13/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="415" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLDigitalSignatureinpi_BD13/image_thumb.png" width="529" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Come si può notare ciò che distingue una modalità dall’altra è il posizionamento dell’elemento &lt;strong&gt;&amp;lt;Signature&amp;gt; &lt;/strong&gt;rispetto al documento firmato. Nel caso di &lt;em&gt;Enveloped &lt;/em&gt;il contenuto da firmare contiene l'elemento &lt;em&gt;&amp;lt;Signature&amp;gt; &lt;/em&gt;mentre si ha la situazione inversa nel formato &lt;em&gt;Enveloping&lt;/em&gt;. La modalità &lt;em&gt;Detached &lt;/em&gt;indica che il documento da firmare è completamente disgiunto dal documento contenente la firma digitale. [XMLDSIG] XML Digital Signature può firmare contemporaneamente più entità rendendo possibile associare in un unico documento XML le diverse modalità di firma. &lt;/p&gt; &lt;p&gt;Nella figura sottostante è rappresentato un esempio di documento XML firmato secondo la specifica [XMLDSIG] nel formato Enveloping. &lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLDigitalSignatureinpi_BD13/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="308" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLDigitalSignatureinpi_BD13/image_thumb_1.png" width="521" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;La struttura di un file XML firmato secondo la specifica è il seguente :&lt;/p&gt; &lt;p&gt;&lt;font face="Lucida Sans Unicode"&gt;&amp;lt;&lt;b&gt;Signature&lt;/b&gt; ID?&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;b&gt;SignedInfo&lt;/b&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;CanonicalizationMethod/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SignatureMethod/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;lt;Reference URI? &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;lt;Transforms&amp;gt;)?&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DigestMethod&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;font size="2"&gt;DigestValue&lt;/font&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Reference&amp;gt;)+&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/SignedInfo&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;b&gt;SignatureValue&lt;/b&gt;&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;lt;&lt;b&gt;KeyInfo&lt;/b&gt;&amp;gt;)?&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;lt;Object ID?&amp;gt;)*&lt;br&gt;&amp;lt;/Signature&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Come si può notare il file XML firmato contiene un elemento &lt;em&gt;Signature &lt;/em&gt;al cui interno troviamo tre aree principali: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;SignedInfo &lt;/strong&gt; &lt;li&gt;&lt;strong&gt;SignatureValue &lt;/strong&gt; &lt;li&gt;&lt;strong&gt;KeyInfo&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;SignedInfo&lt;/em&gt;, il cui schema è :&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element name="SignedInfo" type="ds:SignedInfoType"/&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;complexType name="SignedInfoType"&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;sequence&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;element ref="ds:CanonicalizationMethod"/&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;element ref="ds:SignatureMethod"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;element ref="ds:Reference" maxOccurs="unbounded"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;attribute name="Id" type="ID" use="optional"/&amp;gt; &lt;br&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Letter Gothic'; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&amp;lt;/complexType&amp;gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;rappresenta sempre il primo elemento di &lt;i&gt;ds:Signature &lt;/i&gt;e racchiude il contenuto da firmare e tutte le informazioni necessarie per rappresentare e gestire tali informazioni. &lt;br&gt;Infatti il primo sottoelemento obbligatorio, &lt;i&gt;CanonicalizationMethod&lt;/i&gt;, indica quale algoritmo di normalizzazione deve essere applicato a tutto &lt;i&gt;SignedInfo &lt;/i&gt;mentre &lt;i&gt;SignatureMethod&lt;/i&gt;,anch’esso obbligatorio, rappresenta l’algoritmo di firma da utilizzare alla forma normalizzata di &lt;i&gt;SignedInfo&lt;/i&gt;. L’elemento &lt;i&gt;Reference&lt;/i&gt; (maxOccurs="unbounded" significa che possono essere presenti un numero arbitrario di elementi di questo tipo) raccoglie l’informazione da firmare. Lo schema di Reference  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&amp;lt;element name="Reference" type="ds:ReferenceType"/&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;complexType name="ReferenceType"&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="mso-bidi-font-size: 8.0pt"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;sequence&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;element ref="ds:Transforms" minOccurs="0"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;element ref="ds:DigestMethod"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;element ref="ds:DigestValue"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/sequence&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;attribute name="Id" type="ID" use="optional"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;attribute name="URI" type="anyURI" use="optional"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;attribute name="Type" type="anyURI" use="optional"/&amp;gt; &lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Letter Gothic'"&gt;&lt;font size="2"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/complexType&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;ci mostra chiaramente che :  &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;il contenuto da firmare non è il documento stesso ma bensi l’hash del documento (&lt;i&gt;DigestMethod &lt;/i&gt;e &lt;i&gt;DigestValue&lt;/i&gt;) più le informazioni di rappresentazione.&lt;/strong&gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Quindi la specifica prevede che per ogni documento da firmare vi sia un corrispondente elemento &lt;i&gt;Reference&lt;/i&gt; all’interno di &lt;i&gt;ds:SignedInfo &lt;/i&gt;il quale contiene l’informazione dell’algoritmo di hashing da applicare al documento in chiaro e il rispettivo valore di hash convertito in Base64. L’elemento opzionale &lt;i&gt;Transform &lt;/i&gt;permette di specificare una sequenza di trasformazioni (dalle più semplici come Base64, Canonicalization a soluzioni più complesse basate su XPath o XSLT) da applicare al documento prima di essere firmato garantendo la massima flessibilità nella gestione dei dati.  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLDigitalSignatureinpi_BD13/Figura6.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="177" alt="Figura6" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/SpecifichedibaseXMLDigitalSignatureinpi_BD13/Figura6_thumb.jpg" width="522" border="0"&gt;&lt;/a&gt;  &lt;p&gt;Queste informazioni verranno utilizzate durante la fase di firma e di verifica. Nell’esempio precedente possiamo vedere che l’elemento &lt;i&gt;SignedInfo&lt;/i&gt; contiene il riferimento all’algoritmo di canonicalizzazione &lt;a href="http://blogs.msdn.com/mariofontana/archive/2007/09/17/specifiche-di-base-xml-canonicalization.aspx" target="_blank"&gt;C14N&lt;/a&gt; (&lt;i&gt;"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"&lt;/i&gt;), l’algoritmo di firma il quale indica che è stata usata una coppia di chiavi asimmetriche di tipo RSA (&lt;i&gt;“http://www.w3.org/2000/09/xmldsig#rsa-sha1”&lt;/i&gt;) ed infine &lt;em&gt;Reference&lt;/em&gt; contiene l’algoritmo di hash utilizzato (&lt;i&gt;“http://www.w3.org/2000/09/xmldsig#sha1"&lt;/i&gt;) oltre al valore espresso in Base64 (&lt;i&gt;/mTHMHggNBeZJV8ToGqQwNkgs9s&lt;/i&gt;) della parte di documento XML da firmare referenziato tramite l’attributo &lt;i&gt;URI=”#Persone”&lt;/i&gt;.  &lt;p&gt;Tornando agli elementi che compongono &lt;i&gt;ds:Signature&lt;/i&gt; troviamo l’elemento &lt;i&gt;SignatureValue&lt;/i&gt; il quale semplicemente contiene la firma digitale vera e propria dell’elemento &lt;i&gt;SignedInfo&lt;/i&gt; espressa in Base64. Quindi [XMLDSIG] concepisce la firma di uno o più documenti raccogliendo tutte le informazioni all’interno dell’elemento &lt;i&gt;SignedInfo &lt;/i&gt;(riferimenti ai dati da firmare interni allo stesso documento o esterni, gli algoritmi di hash e gli stessi hash) ed infine, firma direttamente &lt;i&gt;SignedInfo&lt;/i&gt; utilizzando l’algoritmo di canonicalizzazione e di firma specificati. Nell’esempio precedente&amp;nbsp; il valore espresso in &lt;i&gt;SignatureValue&lt;/i&gt; è quindi il prodotto della seguente sequenza:  &lt;blockquote&gt; &lt;p&gt;&lt;i&gt;&lt;strong&gt;Firma_rsa-sha1(C14N(SignedInfo))&lt;/strong&gt;&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Infine l’elemento opzionale &lt;i&gt;KeyInfo&lt;/i&gt; permette di specificare come ottenere la chiave necessaria alla verifica del messaggio. Questo elemento è opzionale in quanto in alcuni scenari le informazioni sulle chiavi fanno parte del contesto applicativo e la specifica, come detto in precedenza, non vuole dare nessuna restrizione alle applicazioni.&lt;br&gt;Lo schema di KeyInfo :  &lt;p&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element name="KeyInfo" type="ds:KeyInfoType"/&amp;gt; &lt;br&gt;&amp;nbsp;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;complexType name="KeyInfoType" mixed="true"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;choice maxOccurs="unbounded"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:KeyName"/&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:KeyValue"/&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:RetrievalMethod"/&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:X509Data"/&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:PGPData"/&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:SPKIData"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;element ref="ds:MgmtData"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;any processContents="lax" namespace="##other"/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;!-- (1,1) elements from (0,unbounded) namespaces --&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;/choice&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;attribute name="Id" type="ID" use="optional"/&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" size="2"&gt;&amp;lt;/complexType&amp;gt;&lt;/font&gt;  &lt;p&gt;dimostra che sono contemplati vari tipi di &lt;i&gt;KeyInfo&lt;/i&gt;. In aggiunta a questi tipi ai quali è stata associata una struttura XML [XMLDSIG] prevede un ulteriore formato, chiamato &lt;i&gt;rawX509Certificate&lt;/i&gt;, che permette di gestire un certificato X509 (binario) codificato in ASN.1 DER. Nel nostro esempio utilizziamo semplicemente l’elemento &lt;i&gt;KeyValue&lt;/i&gt; al cui interno è contenuta la chiave pubblica RSA espressa tramite &lt;i&gt;&amp;lt;Modulus&amp;gt; &lt;/i&gt;e &lt;i&gt;&amp;lt;Exponent&amp;gt;&lt;/i&gt;.  &lt;p&gt;&lt;strong&gt;La fase di verifica della firma digitale avviene in due fasi &lt;/strong&gt;:  &lt;ol&gt; &lt;li&gt;la verifica degli hash contenuti all’interno di ogni &lt;i&gt;Reference&lt;/i&gt;&amp;nbsp; &lt;li&gt;la verifica della firma applicata all’elemento &lt;i&gt;SignedInfo&lt;/i&gt;. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;La prima fase prevede la normalizzazione di tutto &lt;i&gt;SignedInfo&lt;/i&gt; secondo l’algoritmo espresso in &lt;i&gt;CanonicalizationMethod &lt;/i&gt;presente sempre nello stesso &lt;i&gt;SignedInfo&lt;/i&gt;. In seguito, per ogni elemento &lt;i&gt;Reference&lt;/i&gt; si ottiene il documento da verificare tramite l’attributo URI, gli si applicano eventuali trasformazioni, si calcola l’hash utilizzando l’algoritmo identificato in &lt;i&gt;DigestMethod&lt;/i&gt; ed infine lo si paragona con il valore salvato in &lt;i&gt;DigestValue&lt;/i&gt;. &lt;/p&gt; &lt;p&gt;Nella seconda fase invece si ottengono le informazioni riguardanti le chiavi crittografiche e si verifica la firma digitale applicata all’elemento &lt;i&gt;SignedInfo&lt;/i&gt; tramite l’algoritmo specificato in &lt;i&gt;SignatureMethod&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;L’analisi della specifica [XMLDSIG] in questo contesto non è completa ma è sufficiente per introdurre WS-Security, la specifica di base per la sicurezza dei Web Services standardizzata da OASIS.  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5781116" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category></item><item><title>Slides del Panel Sicurezza a WPC 2007</title><link>http://blogs.msdn.com/mariofontana/archive/2007/10/27/slides-del-panel-sicurezza-a-wpc-2007.aspx</link><pubDate>Sat, 27 Oct 2007 12:42:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5707841</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/5707841.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=5707841</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://cid-058b7d5369e7f704.skydrive.live.com/self.aspx/Public/Eventi/WPC2007_Panel_Security_FINAL.pdf" target="_blank"&gt;Qui potete trovare le slides&lt;/a&gt; che ho utilizzato per il &lt;strong&gt;Panel Sicurezza &lt;/strong&gt;: "&lt;em&gt;SOA e Sicurezza Applicativa. Le sfide di oggi e di domani&lt;/em&gt;".&lt;/p&gt; &lt;p&gt;Durante i giorni del WPC ho avuto modo di parlare con molte persone interessate alle problematiche di sicurezza in SOA e ho raccolto e "consolidato" una serie di aree tematiche di interesse comune sulle quali farò dei post di approfondimento.&lt;/p&gt; &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5707841" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/SDL/default.aspx">SDL</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/IDentity+Metasystem/default.aspx">IDentity Metasystem</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/CardSpace/default.aspx">CardSpace</category></item><item><title>Panel Security al WPC 2007 : SOA e Sicurezza Applicativa. Le sfide di oggi e di domani.</title><link>http://blogs.msdn.com/mariofontana/archive/2007/10/19/panel-security-al-wpc-2007-soa-e-sicurezza-applicativa-le-sfide-di-oggi-e-di-domani.aspx</link><pubDate>Fri, 19 Oct 2007 17:37:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5524358</guid><dc:creator>mfontana</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/5524358.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=5524358</wfw:commentRss><description>&lt;p&gt;Per chi di voi sarà al &lt;a href="http://wpc.education.mondadori.it/Document.asp?IdDoc=1099" target="_blank"&gt;WPC 2007&lt;/a&gt; spero di incontrarvi al panel sulla sicurezza &lt;em&gt;"&lt;/em&gt;&lt;a href="http://wpc.education.mondadori.it/SchedaSessione.asp?IdSessione=SEC014" target="_blank"&gt;SOA e Sicurezza Applicativa. Le sfide di oggi e di domani"&lt;/a&gt; che terrò &lt;strong&gt;martedi 23 Ottobre&lt;/strong&gt; dalle 19.15 alle 20.00. Come orario un po' tardino... a mo' di aperativo prima della cena :-) &lt;br&gt;&lt;br&gt;Il formato del panel è pensato apposta per sessioni interattive... poche slides (tanto per inquadrare i punti chiavi) e poi via con le domande e un confronto tra noi e le nostre esperienze sui progetti... &lt;br&gt;E per chi non ne avesse abbastanza la sera dopo cena, questa volta a mo' di digestivo, sarò nell'area "Technical Afterhour" per fare quattro chiacchiere...&lt;/p&gt; &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5524358" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WS-_2A00_/default.aspx">WS-*</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/XML/default.aspx">XML</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/SDL/default.aspx">SDL</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/IDentity+Metasystem/default.aspx">IDentity Metasystem</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/CardSpace/default.aspx">CardSpace</category></item></channel></rss>