<?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 : C/C++</title><link>http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx</link><description>Tags: C/C++</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Protezione da Buffer Overrun con Visual Studio 2010</title><link>http://blogs.msdn.com/mariofontana/archive/2009/06/04/protezione-da-buffer-overrun-con-visual-studio-2010.aspx</link><pubDate>Thu, 04 Jun 2009 14:21:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9699287</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9699287.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9699287</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/vcblog/archive/2009/03/19/gs.aspx" target="_blank"&gt;Segnalo il nuovo posto&lt;/a&gt; del team di C++ sulla nuova versione di /gs, gs++ in &lt;strong&gt;Visual Studio 2010&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Dal post del team di C++ : &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Evolution of GS&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;A lot of code written in C and C++ has vulnerabilities that leave their users open to buffer overrun attacks. There are two major reasons for this. One reason is that the &lt;strong&gt;languages provide unfettered access to the vulnerable memory&lt;/strong&gt;; the other reason is that &lt;strong&gt;developers make mistakes&lt;/strong&gt;. The simple fact is that even following the best practices and performing quality checks, by the end of the day, no developers can get 100 percent of their code right all the time. Thus, additional built-in layers of defense to help track down vulnerable areas of code are in order. The Visual C++ compiler’s GS switch, &lt;strong&gt;which is on by default, is one of the built-in defenses designed to mitigate the buffer overrun attacks&lt;/strong&gt;. …&lt;a href="http://blogs.msdn.com/vcblog/archive/2009/03/19/gs.aspx" target="_blank"&gt;continua alla fonte.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;added &lt;/font&gt;&lt;/strong&gt;: è online anche &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Louis-Lafreniere-Next-Generation-Buffer-Overrun-Protection-gs/" target="_blank"&gt;un video su Channel9&lt;/a&gt; di &lt;strong&gt;Louis Lafreniere&lt;/strong&gt; su &lt;em&gt;Next Generation Buffer Overrun Protection with /GS++ &lt;/em&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=9699287" width="1" height="1"&gt;</description><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 : Configurazione Certificati e sicurezza per gli esempi con SSL</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/30/windows-web-services-api-configurazione-certificati-e-sicurezza-per-gli-esempi-con-ssl.aspx</link><pubDate>Mon, 30 Mar 2009 14:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9513771</guid><dc:creator>mfontana</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9513771.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9513771</wfw:commentRss><description>&lt;P&gt;Tutti gli esempi che ho creato nei post precedenti erano su HTTP quindi senza sfruttare la sicurezza di trasporto (SSL). Ora vediamo quali passi sono necessari per configurare la comunicazione su SSL (&lt;A href="http://msdn.microsoft.com/en-us/library/dd323341(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323341(VS.85).aspx"&gt;uso questo esempio su MSDN&lt;/A&gt; )&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;IMPORTANTE !!! &lt;/STRONG&gt;In questo post alcune delle configurazioni che faccio sui certificati digitali possono risultare molto pericolose su macchine di produzione… In un ambiente di produzione il rilascio,l’installazione e la manutenzione dei certificati deve essere seguito secondo i processi definiti dalla PKI !! Al contrario, sulle macchine dei sviluppatori spesso risulta necessario farsi delle configurazioni ad hoc per essere autonomi rispetto ai colleghi sistemisti :-) :-). Per facilitare la cosa metterò un tag &lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt; &lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;su tutte quelle procedure da non riprodurre in produzione !!&lt;/P&gt;
&lt;P&gt;Innanzitutto i passaggi per impostare i progetti client e service e il processo di creazione dei file .c e .h dal wsdl sono sempre i medesimi descritti &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;qui&lt;/A&gt; e &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx"&gt;qui&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Per far si che il nostro Web Service possa utilizzare il protocollo SSL è necessario configurare quale certificato verrà utilizzato per l’inizializzazione del protocollo. Ce lo ricorda anche un commento nel codice presente in tutti gli esempi su MSDN che utilizzano SSL&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;// NOTE: At the server, the SSL certificate for the listen URI must be &lt;BR&gt;// registered with http.sys using a tool such as httpcfg.exe.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Questa operazione andrà eseguita perchè faremo noi l’hosting del Web Service all’interno di una Win32 console al posto di IIS !! &lt;/P&gt;
&lt;P&gt;In questo post utilizzerò l’utility &lt;EM&gt;netsh.exe &lt;/EM&gt;invece di &lt;EM&gt;httpcfg.exe&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Per prima cosa dovremo procurarci un certificato digitale X509v3. Se non riusciamo ad avere in tempo un certificato da una CA allora seguite questi semplici passi:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;usiamo l’utility &lt;EM&gt;makecert.exe&lt;/EM&gt; per creare ed installare il certificato nel &lt;EM&gt;certificate store &lt;/EM&gt;di Windows. (maggiori info sui &lt;A href="http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx"&gt;certificati&lt;/A&gt; e sugli &lt;A href="http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx"&gt;store&lt;/A&gt; in Windows). Apriamo una console di Visual Studio in Administrator mode e lanciamo :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;makecert -r -pe -n "CN= 127.0.0.1" -b 01/01/2009 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;/WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Tramite questo comando abbiamo creato un certificato per “Ensure the identity of a remote computer” e “All issuance policies” ed è stato installato nel certificate store della macchina (local machine). Apriamo la mmc dei certificati e clicchiamo sul certificato in &lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; e dovremmo vedere una cosa simile a quanto riportato in figura.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_4.png" width=511 height=334 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;a questo punto se proviamo a lanciare il nostro esempio riceviamo il seguente errore : &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x803d0014 &lt;BR&gt;There was an error communicating with the endpoint at '&lt;/EM&gt;&lt;A href="https://127.0.0.1:8999/examplex" mce_href="https://127.0.0.1:8999/examplex"&gt;&lt;EM&gt;https://127.0.0.1:8999/example’&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;. &lt;BR&gt;The connection with the server was terminated abnormally&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;questo perchè non abbiamo ancora creato il binding tra l’URI e il certificato digitale nel nostro kernel mode http listener(Http.sys) e quindi il protocollo SSL non può funzionare.&amp;nbsp; Infatti se lanciamo il seguente comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http show sslcert&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;abbiamo una lista dei certificati configurati per SSL con relativo IP:port e hash del certificato! Ovviamente il nostro &lt;EM&gt;127.0.0.1:8999 &lt;/EM&gt;non esiste. Quindi lo creiamo lanciando il seguente comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http add sslcert ipport=&lt;STRONG&gt;127.0.0.1:8999&lt;/STRONG&gt; certhash=a455de0b81ce3251d177d9fb74c62fe237a49ae1 appid={00112233-4455-6677-8899-AABBCCDDEEFF}&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In questo caso abbiamo impostato il parametro &lt;STRONG&gt;&lt;EM&gt;ipport=127.0.0.1:8999 &lt;/EM&gt;&lt;/STRONG&gt;e &lt;EM&gt;certhash &lt;/EM&gt;con l’hash del nostro certificato appena creato. Per ottenere il valore dell’hash dobbiamo aprire il certificato e alla voce &lt;EM&gt;Thumbprint &lt;/EM&gt;nella tab &lt;EM&gt;Details &lt;/EM&gt;copiare il contenuto. &lt;STRONG&gt;Ricordarsi di togliere gli spazi !!!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_12.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_5.png" width=395 height=356 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;se ora rilanciamo il comando &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http show sslcert&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;potremo vedere il nuovo binding sulla porta 8999&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_14.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_6.png" width=390 height=147 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Se proviamo ora a lanciare il nostro esempio riceviamo un altro errore:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x803d000a &lt;BR&gt;There was an error communicating with the endpoint at '&lt;/EM&gt;&lt;A href="https://127.0.0.1:8999/example’" mce_href="https://127.0.0.1:8999/example’"&gt;&lt;EM&gt;https://127.0.0.1:8999/example’&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;. &lt;BR&gt;The certificate authority is invalid or incorrect&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;infatti come si vede anche dalla &lt;STRONG&gt;figura 1&lt;/STRONG&gt; il certificato che abbiamo creato ed installato non è valido dal punto di vista della “&lt;EM&gt;Certification path&lt;/EM&gt;”. Per rimediare a questo problema basta copiare il certificato da &lt;BR&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;a&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Certificates (Local Computer)-&amp;gt;Trusted Root Certification Authorities-&amp;gt;Certificates &lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;/WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;a quel punto, se riclicchiamo sul certificato all’interno di &lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; avremo :&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_8.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_3.png" width=335 height=209 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;che ci assicura che tutta la “&lt;EM&gt;Certification path&lt;/EM&gt;” è corretta.&lt;/P&gt;
&lt;P&gt;Finalmente, se ora lanciamo il&amp;nbsp; Web Service e il client il tutto funziona con il protocollo SSL !!!! Finito?? Non direi :-) &lt;/P&gt;
&lt;H3&gt;NOOOOO… UN WEB SERVICE CHE GIRA SOLO COME ADMINISTRATOR???&lt;/H3&gt;
&lt;P&gt;In effetti, se ci fermiamo qui i nostri Web Services girano solo se hanno le credenziali di amministratore !!! Orrore !!! Infatti se creiamo due local &lt;EM&gt;Users demo1 &lt;/EM&gt;e &lt;EM&gt;demo2 (aggiungere la policy longon locally se si tratta del server) &lt;/EM&gt;e dalla nostra console amministrativa lanciamo &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;runas /user:demo1 cmd.exe (dopo l’invio ci chiede la password)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;runas /user:demo2 cmd.exe (dopo l’invio ci chiede la password)&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;se nella cmd di &lt;EM&gt;demo1&lt;/EM&gt; ad esempio lanciamo il nostro service (che prima funzionava nella console che gira come admin) avremo come risposta :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x80070005 &lt;BR&gt;Unable to add URL to HTTP URL group. &lt;BR&gt;&lt;STRONG&gt;Access is denied.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Per superare questo ultimo scoglio dobbiamo assegnare i permessi ad un gruppo di utenti (o ad un singolo utente nel nostro caso, per semplicità) per un determinato &lt;EM&gt;HTTP URL namespace&lt;/EM&gt;. Con questa operazione di fatto diamo la possibilità di creare dei servizi di listener su determinati URL a tutti i processi che girano con le credenziali definite. Questa operazione verrà effettuata, ad esempio, durante il processo di installazione dei nostri servizi. Per fare questa operazione lanciamo il comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http add urlacl url=http&lt;B&gt;s&lt;/B&gt;://127.0.0.1:8999/example user=demo1&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;e possiamo visualizzare il nuovo namespace reservation tramite il comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http show urlacl&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_16.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_7.png" width=421 height=134 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_7.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;a questo punto se rilanciamo il servizio sempre dalla console &lt;EM&gt;demo1&lt;/EM&gt; … funzionerà !!!&amp;nbsp; mentre se lo lanciamo dalla console &lt;EM&gt;demo2 &lt;/EM&gt;no !! &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_18.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_18.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_8.png" width=561 height=297 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_8.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;La prova del nove? Dalla console amministrativa lanciate il comando:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http delete urlacl url=https://127.0.0.1:8999/example&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;che cancella nuovamente la reservation e vedrete che se rilanciate il vostro Web service sempre dalla console &lt;EM&gt;demo1&lt;/EM&gt; non funzionerà nuovamente :-)&lt;/P&gt;
&lt;H3&gt;Un paio di Curiosità &lt;/H3&gt;
&lt;P&gt;1) &lt;STRONG&gt;Dove vengono registrate le info di &lt;EM&gt;netsh.exe&lt;/EM&gt; ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Tutte le impostazioni vengono salvate nel registy :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\&lt;STRONG&gt;SslBindingInfo&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_22.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_22.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_2.png" width=503 height=102 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;e in &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\&lt;STRONG&gt;UrlAclInfo&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_20.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_20.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/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_1.png" width=505 height=254 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2) Quali API devo utilizzare per crearmi programmaticamente una URL reservation?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Le API di riferimento sono le &lt;/STRONG&gt;&lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa364622(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa364622(VS.85).aspx"&gt;HTTP Server API Reference&lt;/A&gt;. &lt;BR&gt;Alla fine il tutto si risolve tramite le API &lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;ULONG HttpInitialize( __in HTTPAPI_VERSION Version, &lt;BR&gt;&lt;/EM&gt;&lt;EM&gt;__in ULONG Flags, &lt;BR&gt;__reserved PVOID pReserved );&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;e&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;EM&gt;ULONG HttpSetServiceConfiguration(
  __in  HANDLE ServiceHandle,
  __in  HTTP_SERVICE_CONFIG_ID ConfigId,
  __in  PVOID pConfigInformation,
  __in  ULONG ConfigInformationLength,
  __in  LPOVERLAPPED pOverlapped
);&lt;/EM&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Stavo per scrivere il wrapper in C# via p/Invoke ma grazie a Keith Brown &lt;A href="http://www.pluralsight.com/community/blogs/keith/archive/2005/10/17/15632.aspx" target=_blank mce_href="http://www.pluralsight.com/community/blogs/keith/archive/2005/10/17/15632.aspx"&gt;ho risparmiato almeno un’oretta di lavoro&lt;/A&gt; :-). Anche in questo caso, esclusi i vari controlli il tutto si riduce nelle due chiamate alle HTTP API.&lt;/P&gt;&lt;EM&gt;&lt;/EM&gt;
&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// Inizializzazioni varie delle HTTP API&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;…&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// Impostazione delle ACL&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;int errorCode = HttpInitialize(httpApiVersion,HTTP_INITIALIZE_CONFIG, IntPtr.Zero);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;errorCode = HttpSetServiceConfigurationAcl(IntPtr.Zero, HttpServiceConfigUrlAclInfo,ref configInfo, Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)),IntPtr.Zero);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;//Chiamte a Funzioni HTTPAPI di CleanUp…&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;…&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Infine, mi raccomando di ricordarsi di cancellare o disattivare gli utenti locali demo1 e demo2 e di cancellare i certificati quanto prima !!!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;--Mario&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9513771" 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/Crittografia/default.aspx">Crittografia</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/CryptoAPI/default.aspx">CryptoAPI</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 – 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></channel></rss>