<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Visual C#.it News &#187; C#</title>
	<atom:link href="http://visualcsharp.it/news/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://visualcsharp.it/news</link>
	<description>Il blog della comunità italiana del linguaggio C#</description>
	<lastBuildDate>Sat, 12 Dec 2009 09:01:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WCF &#8211; VIII Parte</title>
		<link>http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/</link>
		<comments>http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 11:59:25 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=157</guid>
		<description><![CDATA[WCF e Windows Service
Un aspetto molto interessante di Windows Communication Foundation è la possibilità di ospitare un servizio WCF all’interno di un servizio di Windows.

Questa è decisamente una tecnica fortemente consigliata se il nostro servizio non necessita di un’interazione con alcuna UI e noteremo inoltre come tale soluzione non sia poi così differente rispetto a [...]]]></description>
			<content:encoded><![CDATA[<p><strong>WCF e Windows Service</strong><br />
Un aspetto molto interessante di Windows Communication Foundation è la possibilità di ospitare un servizio WCF all’interno di un servizio di Windows.<br />
<span id="more-157"></span><br />
Questa è decisamente una tecnica fortemente consigliata se il nostro servizio non necessita di un’interazione con alcuna UI e noteremo inoltre come tale soluzione non sia poi così differente rispetto a tutti i precedenti esempi mostrati sin’ora, dove tutti i servizi WCF creati erano ospitati in applicazioni windows e applicazioni web.</p>
<p><em>il Server</em><br />
Avviamo VS scegliendo come tipo di progetto “Windows Service”.<br />
Dal Solution Explorer posizioniamoci su Service1.cs e andiamo ad apportare le seguenti modifiche al codice auto generato:</p>
<pre>using System.ServiceModel;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase, IServiceClass
    {
        ServiceHost sh = null;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            if (sh != null) sh.Close();

            sh = new ServiceHost(typeof(Service1));

            sh.Open();
        }

        protected override void OnStop()
        {
            if (sh != null)
            {
                sh.Close();
                sh = null;
            }
        }

        public string DoWork()
        {
            return DateTime.Now.ToString();
        }
    }

    [ServiceContract]
    public interface IServiceClass
    {
        [OperationContract]
        string DoWork();
    }
}</pre>
<p>Non c’è molto da dire.<br />
E’ stata semplicemente aggiunta l’interfaccia del nostro servizio WCF decorata dai soliti attributi, quindi la sua implementazione è stata riportata nella classe Service1 del servizio di windows, facendo ereditare quest’ultima da ServiceBase e appunto dall’interfaccia del servizio WCF, IServiceClass.<br />
Il metodo DoWork è stato correttamente implementato e infine abbiamo gestito i metodi che verranno eseguiti all’avvio e alla chiusura del windows service.<br />
Non ci resta che aggiungere e impostare correttamente il file di configurazione e per farlo, dal menu Project di VS scegliamo Add New Item, quindi Application Configuration File.<br />
Minimizzando il più possibile, ecco le impostazioni di configurazione da inserire per il nostro servizio WCF:</p>
<pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;configuration&gt;
  &lt;system.serviceModel&gt;
    &lt;services&gt;
      &lt;service behaviorConfiguration="myBehave"&gt;
        &lt;host&gt;
          &lt;baseAddresses&gt;
            &lt;add baseAddress="net.tcp://localhost:12345/tcp"/&gt;
          &lt;/baseAddresses&gt;
        &lt;/host&gt;
        &lt;endpoint address="" binding="netTcpBinding" contract="WindowsService1.IServiceClass"/&gt;
        &lt;endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/&gt;
      &lt;/servce&gt;
    &lt;/services&gt;
    &lt;behaviors&gt;
      &lt;serviceBehaviors&gt;
        &lt;behavior name="myBehave"&gt;
          &lt;serviceDebug includeExceptionDetailInFaults="false"/&gt;
          &lt;serviceMetadata httpGetEnabled="false"/&gt;
        &lt;/behavior&gt;
      &lt;/serviceBehaviors&gt;
    &lt;/behaviors&gt;
  &lt;/system.serviceModel&gt;
&lt;/configuration&gt;</pre>
<p>Un’unica considerazione da fare è in merito a due nuovi elementi, host e baseAddress.<br />
Specificando l&#8217;indirizzo in baseAddress evitiamo di scrivere l&#8217;intero percorso per sia per l&#8217;endpoint del servizio, che per il suo indrizzo mex.<br />
L’ultimo step per la creazione del windows service consiste nella sua configurazione fattibile attraverso l’add installer messo a disposizione da VS, attraverso il quale possiamo imposare il nome del servizio, la sua descrizione, il tipo di account e il tipo di avvio.<br />
Il servizio di windows è pronto, compiliamo il progetto e prepariamoci alla sua installazione tramite l’utility installUtil.<br />
Avviamo dunque il command prompt di VS e digitiamo il seguente comando:</p>
<pre>installUtil.exe servicePath\fileName.</pre>
<p>Infine, andiamo nel servizio di Windows e avviamo il nostro servizio appena creato.<br />
Nota: a procedura terminata, per disinstallare il servizio di esempio da noi creato basterà riavviare il command propomt di VS e digitare quanto segue:</p>
<pre>installUtil.exe /u servicePath\fileName.</pre>
<p><em>Il Client</em><br />
Avviamo la seconda ed ultima istanza di VS e scegliamo come tipo di progetto una Windows Form Application.<br />
Inseriamo il solito Button, quindi dal menu Project scegliamo Add Service Reference, digitando nella barra degli indirizzi il baseAddress impostato nel server: net.tcp://localhost:12345<br />
Aggiunto il riferimento al servizio non ci resta che aprire una connessione e consumarlo con il metodo DoWork:</p>
<pre>ServiceReference1.Service1 s =
                new WindowsFormsApplication1.ServiceReference1.Service1();

            this.Text = s.DoWork();

            s.Close();</pre>
<p>Questo codice è ormai familiare: è stata creata un’istanza di Service1, quindi è stato consumato il servizio WCF attraverso la chiamata al metodo DoWork.</p>
<p><em>Conclusioni</em><br />
In pochi semplici passaggi è stato illustrato come ospitare un servizio WCF all’interno di un servizio di windows. La procedura dovrebbe risultare abbastanza chiara anche per coloro che non abbiano mai avuto necessità di sviluppare windows services, diversamente basterà fare qualche domanda sul forum di visualcsharp, o commentare questo stesso articolo.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;submitHeadline=WCF+%26%238211%3B+VIII+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+VIII+Parte&amp;url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;title=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+VIII+Parte+@+http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/&amp;t=WCF+%26%238211%3B+VIII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/12/11/wcf-viii-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; VII Parte</title>
		<link>http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/</link>
		<comments>http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 17:20:13 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=143</guid>
		<description><![CDATA[Sicurezza in WCF
In una tecnologia che permette lo scambio di messaggi SOAP tra clients e servizi risulta essere di estrema importanza la sicurezza legata all’intero processo cui sono sottoposte queste informazioni.
In questo senso WCF integra nella sua piattaforma tecnologie ormai più che consolidate, già esistenti.

Possiamo racchiudere il principio di WCF security in quattro concetti: integrity, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Sicurezza in WCF</strong><br />
In una tecnologia che permette lo scambio di messaggi SOAP tra clients e servizi risulta essere di estrema importanza la sicurezza legata all’intero processo cui sono sottoposte queste informazioni.<br />
In questo senso WCF integra nella sua piattaforma tecnologie ormai più che consolidate, già esistenti.<br />
<span id="more-143"></span><br />
Possiamo racchiudere il principio di WCF security in quattro concetti: integrity, confidentiality, authentication e authorization.</p>
<p>Sebbene il WCF security sia un argomento vasto e fondamentale, in questa parte del tutorial si è deciso di affrontare più gli aspetti pratici con il solito progetto di esempio “passo-passo”, piuttosto che dilungarsi troppo sulla parte teorica.</p>
<p>Lo scopo della soluzione che andremo a creare sarà quello di permettere la comunicazione tra client e server esclusivamente previa autenticazione e garantiremo inoltre la sicurezza inerente lo scambio dei messaggi durante il loro intero processo.<br />
L’aspetto più interessante di tutto ciò sarà l’integrazione di un authentication process security completamente personalizzato rendendo il progetto certamente più corposo, ma in grado di offrire al lettore tutti gli strumenti, o quasi, per potersi destreggiare con una certa agilità su questo argomento.</p>
<p><em>Il Server</em><br />
Avviamo la prima istanza di VS e creiamo un progetto Web, quindi aggiungiamo subito un servizio WCF e ridefiniamo il metodo DoWork in modo che restituisca una stringa qualunque.<br />
Come detto precedentemente, per poter accedere al servizio ed usufruire del metodo offerto sarà necessario fornire delle credenziali personalizzate, username e password di nostra scelta.<br />
Per rendere questo possibile dobbiamo innanzitutto creare una classe, nel nostro esempio implementata in una dll, che eredita da UserNamePasswordValidator e ridefinirne il metodo Validate.</p>
<p>Avviamo quindi un’altra istanza di VS e scegliamo come progetto una nuova libreria di classi, inserendo questo codice al suo interno:</p>
<pre>using System.IdentityModel;
using System.IdentityModel.Selectors;
namespace ClassLibrary1
{
    public class MyValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName != "user" || password != "pwd")
                throw new Exception("Username o Password non validi.");
        }
    }
}</pre>
<p>Compiliamo la libreria e aggiungiamola come riferimento al progetto web.</p>
<p>A questo punto dobbiamo apportare una serie di modifiche al file web.config in modo da istruire correttamente il servizio su come dovrà comportarsi.<br />
In particolare, dovremo specificare che tipo di autenticazione vogliamo utilizzare, quale certificato sfruttare per la crittografia dei dati di accesso e la modalità di sicurezza per i messaggi:</p>
<pre>&lt;behaviors&gt;
   &lt;serviceBehaviors&gt;
    &lt;behavior name="WebApplication1.Service1Behavior"&gt;
     &lt;serviceMetadata httpGetEnabled="true"/&gt;
     &lt;serviceDebug includeExceptionDetailInFaults="true"/&gt;  
          &lt;serviceCredentials&gt;
            &lt;userNameAuthentication userNamePasswordValidationMode="Custom"
                                    customUserNamePasswordValidatorType="ClassLibrary1.MyValidator, ClassLibrary1" /&gt;
            &lt;serviceCertificate findValue="MyServerCert" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" /&gt;
          &lt;/serviceCredentials&gt;
        &lt;/behavior&gt;
   &lt;/serviceBehaviors&gt;
  &lt;/behaviors&gt;
    &lt;bindings&gt;
      &lt;wsHttpBinding&gt;
        &lt;binding name="myBinding"&gt;
          &lt;security mode="Message"&gt;
            &lt;message clientCredentialType="UserName"/&gt;
          &lt;/security&gt;
        &lt;/binding&gt;
      &lt;/wsHttpBinding&gt;
    &lt;/bindings&gt;
  &lt;services&gt;
   &lt;service behaviorConfiguration="WebApplication1.Service1Behavior" name="WebApplication1.Service1"&gt;
    &lt;endpoint address="" binding="wsHttpBinding" contract="WebApplication1.IService1" bindingConfiguration="myBinding"&gt;
     &lt;identity&gt;
      &lt;dns value="localhost"/&gt;
     &lt;/identity&gt;
    &lt;/endpoint&gt;
    &lt;endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/&gt;
   &lt;/service&gt;
  &lt;/services&gt;</pre>
<p>Soffermiamoci sui punti di maggior interesse.<br />
In Behaviors abbiamo aggiunto un nuovo elemento, ServiceCredentials in cui abbiamo specificato il tipo di autenticazione (Custom) e il tipo di convalida per tali credenziali (cioè la classe creata e situata nella dll aggiunta al progetto).<br />
All’interno di ServiceCredentials troviamo poi l’elemento ServiceCertificate che specifica quale certificato utilizzare. Nel nostro progetto il certificato specificato è un certificato di esempio creato da noi e installato sulla macchina su cui stiamo costruendo la soluzione; poco più avanti verrà spiegato in che modo crearlo e installarlo.<br />
L’altro punto di interesse è la sezione relativa al binding, in cui è stato inserito l’elemento security, impostandone la modalità a message e per questi messaggi che tipo di credenziali il client dovrà usare.<br />
Il nostro server è pronto, prima di premdere F5 però, come detto pocanzi dobbiamo installare sulla nostra macchina un certificato di esempio come specificato nell’elemento ServiceCertificate. Per farlo avviamo il command prompt di VS e digitiamo la seguente riga seguita dal tasto invio:</p>
<pre>makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServerCert -sky exchange –pe</pre>
<p>Il certificato è ora installato, possiamo quindi avviare il nostro server premendo F5.</p>
<p><em>Il Client</em><br />
Avviamo ancora una volta Vs e optiamo per la creazione di una Windows Form, quindi inseriamo un Button.<br />
Aggiungiamo il riferimento al nostro servizio in esecuzione e iniziamo a configurare correttamente il client.<br />
Prima di tutto è necessario verificare l’esistenza e la validità del certificato sul server e per farlo, anche in questo caso scriveremo una classe contenuta in un assembly che eredita da X509CertificateValidator.<br />
Creiamo quindi un nuovo ed ultimo progetto di tipo libreria di classi e inseriamo il seguente codice:</p>
<pre>using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;

namespace ClassLibrary2
{
    public class MyX509Validator : X509CertificateValidator
    {
        public override void Validate(X509Certificate2 certificate)
        {
            if (certificate == null)
                throw new ArgumentNullException("Nessun certificato rilevato");

            if (certificate.SubjectName.Name != "CN=MyServerCert")
                throw new SecurityTokenValidationException("Certificato non valido");
        }
    }
}</pre>
<p>Le istruzioni presenti non fanno altro che verificare l’esistenza di un certificato e la sua validità, cioè la sua corrispondenza al certificato da noi desiderato.<br />
Aggiungiamo un riferimento alla libreria appena creata sulla nostra applicazione e prepariamoci ad esaminare e modificare il solito app.config:</p>
<pre>&lt;bindings&gt;
            &lt;wsHttpBinding&gt;
                &lt;binding name="WSHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false"&gt;
                    &lt;readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" /&gt;
                    &lt;reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" /&gt;
                    &lt;security mode="Message"&gt;
                      &lt;message clientCredentialType="UserName" /&gt;                   
                    &lt;/security&gt;
                &lt;/binding&gt;
            &lt;/wsHttpBinding&gt;
        &lt;/bindings&gt;
      &lt;behaviors&gt;
        &lt;endpointBehaviors&gt;
          &lt;behavior name="myClientBehavior"&gt;
            &lt;clientCredentials&gt;
              &lt;serviceCertificate&gt;
                &lt;authentication certificateValidationMode="Custom" customCertificateValidatorType="ClassLibrary2.MyX509Validator, ClassLibrary2" /&gt;
              &lt;/serviceCertificate&gt;
            &lt;/clientCredentials&gt;
          &lt;/behavior&gt;
        &lt;/endpointBehaviors&gt;
      &lt;/behaviors&gt;
      &lt;client&gt;
            &lt;endpoint address="<a href="http://localhost:50384/Service1.svc">http://localhost:50384/Service1.svc</a>" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="WSHttpBinding_IService1" behaviorConfiguration="myClientBehavior"&gt;
                &lt;identity&gt;
                    &lt;dns value="MyServerCert" /&gt;
                &lt;/identity&gt;
            &lt;/endpoint&gt;
        &lt;/client&gt;</pre>
<p>Un primo sguardo va dato sull’elemento security all’interno del’elemento binding, dove anche qui, come per il server è stata impostata la modalità di sicurezza (message) e la tipologia di credenziali da fornire (userName).<br />
Ancor più interessante è la sezione behaviors, in cui viene specificato il comportamento per un singolo endpoint. E’ stato impostato il nome del behavior ed il tipo di autenticazione attraverso il riferimento alla libreria creata precedentemente.<br />
Nell’ elemento endpoint poi è stato ovviamente inserito l’attributo behaviorConfiguration, specificando così a quale endpointBehaviors fare riferimento ed infine è stato modificato a MyServerCert il valore di value per l’elemento dns.</p>
<p>Non ci resta che gestire l’evento click del Button in questo modo:</p>
<pre>ServiceReference1.Service1Client s = new WindowsFormsApplication1.ServiceReference1.Service1Client();
s.ClientCredentials.UserName.UserName = "user";    s.ClientCredentials.UserName.Password = "pwd";
s.Open();
this.Text = s.DoWork();
s.Close();</pre>
<p>Anche il client è terminato.<br />
Non ci sono molte considerazioni da fare per questo code snippet: è stata semplicemente creata un’istanza di Service1Client e prima di aprire la connessione e chiamare il metodo DoWork sono state impostate le credenziali di accesso al servizio.<br />
Si noti però che le impostazioni di UserName e Password non sono possibili attraverso il file config, ma solo via codice.<br />
Premiamo F5 e clicchiamo sul Button.<br />
Il risultato dovrebbe essere la visualizzazione della stringa restituita dal metodo esposto nel servizio nella barra del titolo della Windows Form.</p>
<p><em>Qualcosa in più da sapere…</em><br />
La piattaforma WCF implementa sistemi di sicurezza in modo efficiente, ma senza introdurre nulla di nuovo, usufruendo così di tecnologie già ben consolidate e conosciute dalla gran parte degli sviluppatori.<br />
Ad esempio, nel nostro progetto avremmo potuto optare per un tipo di autenticazione nativa, come quella di Windows e certamente non sarebbe stata una scelta meno azzeccata o meno sicura di quella custom.<br />
Il fatto di aver voluto utilizzare delle credenziali personalizzate, come Userame e Password trova riscontro in più ragioni: prima fra tutte, si ha avuto modo, nonché necessità di inserire nuovi elementi nel file config sino ad ora mai introdotti nei precedenti tutorial.<br />
Ancora, in tanti e tanti tipi di progetti reali, la volontà di permettere un accesso sicuro client/server attraverso classiche credenziali “nome utente/password” è quasi una costante.<br />
In rete è possibile trovare diverse guide, MSDN è una fonte eccezionale ed inesauribile, libri di testo ne esistono a volontà, eppure non sembra essere così semplice riuscire a trovare un esempio completo in ogni minimo dettaglio sull’utilizzo di credenziali custom in WCF.</p>
<p>Sempre a proposito di security, WCF integra nella sua piattaforma il concetto di Authorization e con esso, è possibile impostare dei criteri di autorizzazione/accesso a determinate risorse del servizio.<br />
Tutto ciò è reso possibile attraverso l’attributo PrincipalPermission applicato a metodi del servizio, ASP.NET Membership e Role Provider, Authorization Manager e Identity Model.</p>
<p><em>Conclusioni</em><br />
In questo articolo si è appreso come integrare differenti livelli di sicurezza lato client/server in WCF e se si considerano le sei precedenti pubblicazioni possiamo ritenere di conoscere gran parte degli elementi essenziali per un corretto utilizzo di questa tecnologia.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;submitHeadline=WCF+%26%238211%3B+VII+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+VII+Parte&amp;url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;title=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+VII+Parte+@+http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/&amp;t=WCF+%26%238211%3B+VII+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/12/07/wcf-vii-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; VI Parte</title>
		<link>http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/</link>
		<comments>http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 08:02:25 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=123</guid>
		<description><![CDATA[Service Behaviors
Il controllo del threading process e la gestione delle istanze di un servizio avviene per mezzo dei Service Behaviors.
Di questi attributi, ne distinguiamo due tipi: service behavior (attributo di classe) e operation behavior (attributo di operazione), entrambi con il loro set di proprietà disponibili.

A differenza di tutti gli altri attributi visti sin’ora, i service [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Service Behaviors</strong><br />
Il controllo del threading process e la gestione delle istanze di un servizio avviene per mezzo dei Service Behaviors.<br />
Di questi attributi, ne distinguiamo due tipi: service behavior (attributo di classe) e operation behavior (attributo di operazione), entrambi con il loro set di proprietà disponibili.<br />
<span id="more-123"></span><br />
A differenza di tutti gli altri attributi visti sin’ora, i service e gli operation attributes si applicano alla classe che implementa l’interfaccia del servizio, non all’interfaccia stessa.</p>
<p>Se provassimo ad applicare qualche attributo, durante la digitazione, l’intellisense di Visual Studio ci mostrerebbe tutte le proprietà disponibili ed i possibili tipi di valore da associare.<br />
Riprendendo un esempio già mostrato, vediamo come poter impostare alcuni degli attributi disponibili:</p>
<pre>[ServiceContract]
    public interface IServiceClass
    {
        [OperationContract]
        bool CreateDirectoryAndFile(string directoryName, string fileName);
    }

    [ServiceBehavior(AutomaticSessionShutdown=true, ConcurrencyMode=ConcurrencyMode.Single,
        TransactionTimeout="00:01:00")]
    public class ServiceClass : IServiceClass
    {
        [OperationBehavior(AutoDisposeParameters=true)]
        public bool CreateDirectoryAndFile(string directoryName, string fileName)
        {
            try
            {
                Directory.CreateDirectory(directoryName);

                File.Create(directoryName + "\\" + fileName);

                return true;
            }
            catch { return false; }
        }
    }</pre>
<p>Come si può notare, è la classe che implementa l’interfaccia ad essere decorata dall’attributo in questione e non viceversa.<br />
Con il parametro AutomaticSessionShutdown impostato a true si determina la chiusura automatica della sessione una volta che il servizio ha elaborato e processato tutti i messaggi.<br />
Il parametro ConcurrencyMode invece determina la gestione del service thread. Impostando tale parametro a ConcurrencyMode.Single si vuole intendere che qualora arrivi un messaggio mentre un altro è già in elaborazione, il nuovo messaggio arrivato non sarà processato fino a quando non sarà terminata l’elaborazione del primo.<br />
L’ultimo parametro per l’attributo ServiceBehavior inserito in questo esempio è TransactionTimeout, che come si evince dal suo nome determina il tempo entro il quale una transazione dovrà essere terminata, nell’esempio il tempo massimo è impostato a un minuto.</p>
<p>Per l’attributo OperationBehavior è stato inserito un solo parametro, l’AutoDisposeParameters impostato a true. In questo caso si specifica che i parametri passati al metodo saranno automaticamente rilasciati.</p>
<p>In questo esempio abbiamo applicato degli attributi attraverso codice, ma è anche possibile e anzi, è prassi piuttosto comune impostare attributi attraverso il file di configurazione.<br />
Ancora una volta l’intellisense di VS ci viene in aiuto..<br />
Riprendendo il primo esempio di servizio WCF mostrato nella prima parte di questo tutorial, vediamo alcuni elementi del file web.config in riferimento ai serviceBehaviors:</p>
<pre>serviceMetadata httpGetEnabled="true"
serviceDebug includeExceptionDetailInFaults="true"
serviceThrottling maxConcurrentSessions="3"</pre>
<p>Particolare attenzione va rivolta all’attributo serviceThrottling e serviceDebug.<br />
Con maxConcurrentSession impostato a valore 3 per l’attributo serviceThrottling, si specifica il numero massimo di connessioni al servizio per un singolo canale. Infatti, se provassimo a rieseguire il progetto e provassimo a cliccare sul button del nostro client per più di tre volte, l’applicativo andrebbe in blocco.<br />
Il valore di default per questo parametro è 10, impostandolo a 0 invece otterremo l’equivalente di Int32.MaxValue.<br />
Altrettanto interessante è l’attributo serviceDebug in cui è dichiarato il parametro includeExceptionDetailInFaults impostato a true. Tale valore permette permette al client di ricevere messaggi SOAP derivanti da eventuali errori/eccezioni verificatisi nel servizio, essenziale durante il debug del nostro software.</p>
<p><strong>Gestione delle Eccezioni</strong><br />
In WCF le eccezioni gestite, per poter essere inviate al client devono essere convertire in messaggi SOAP, detti anche SOAP fault messages dove ne distinguiamo due tipi, declared e undeclared.<br />
I tipi declared ci permettono di personalizzare un SOAP fault e la loro implementazione avviene mediante l’attributo FaultContract applicato all’operazione desiderata.<br />
Di seguito è riportato un frammento di codice client/server per capirne meglio la sintassi:</p>
<pre>//SERVER*****************************
[ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [FaultContract(typeof(Test), ProtectionLevel=System.Net.Security.ProtectionLevel.EncryptAndSign)]
        string DoWork(int x);
    }

[DataContract]
    public class Test
    {
        private string message;

        public Test(string msg) { message = msg; }

        [DataMember]
        public string Message
        {
            get { return this.message; }
            set { message = value; }
        }

public class Service1 : IService1
    {
        public string DoWork(int x)
        {

            if (x &lt; 10) return "ok";
            else throw new FaultException(new Test("Il valore di X è maggiore di 10"));
        }
    }
//*******************************

//CLIENT
try
            {
                ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client();

                MessageBox.Show(sc.DoWork(5));

                MessageBox.Show(sc.DoWork(12));//questa chiamata genera eccezione
            }
            catch(FaultException errorCode)
            {
                MessageBox.Show(errorCode.Detail.Message);
            }
            catch (FaultException unknowFault)
            {
                MessageBox.Show(unknowFault.Message);
            }
        }</pre>
<p>Nella parte server abbiamo applicator l’attributo FaultContract sul metodo DoWork, specificando due parametri, typedof(nome Classe) e protectionLevel. Il primo, essenziale per creare una gestione di eccezioni personalizzata, permette all’interno dell’implementazione del metodo DoWork di lanciare un’eccezione FaultException di tipo Test.</p>
<p>Nel client è stato semplice inserito un blocco try – catch per la cattura di due eccezioni: la prima, una FaultException di tipo Test e l’altra, un FaultException generica.</p>
<p><em>Conclusioni</em><br />
Abbiamo dato uno sguardo sull’implementazione dei ServiceBehaviors e delle FaultException.<br />
A questo punto del tutorial sarebbe opportuno iniziare a scrivere qualcosa di mano propria e sperimentare quanto più possibile.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;submitHeadline=WCF+%26%238211%3B+VI+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+VI+Parte&amp;url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;title=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+VI+Parte+@+http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/&amp;t=WCF+%26%238211%3B+VI+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/30/wcf-vi-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; V Parte</title>
		<link>http://visualcsharp.it/news/2009/11/27/wcf-v-parte/</link>
		<comments>http://visualcsharp.it/news/2009/11/27/wcf-v-parte/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 20:50:34 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=120</guid>
		<description><![CDATA[Consumare un servizio WCF, un approccio diverso…
Negli esempi visti sino ad ora, quando abbiamo avuto bisogno di consumare un servizio WCF non abbiamo fatto altro che contattare l’endpoint attraverso Visual Studio e successivamente istanziare un oggetto della classe del servizio, proprio come se l’avessimo creata in locale, potendo così usufruire delle operazioni offerte.

Sebbene questo sia [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Consumare un servizio WCF, un approccio diverso…</strong><br />
Negli esempi visti sino ad ora, quando abbiamo avuto bisogno di consumare un servizio WCF non abbiamo fatto altro che contattare l’endpoint attraverso Visual Studio e successivamente istanziare un oggetto della classe del servizio, proprio come se l’avessimo creata in locale, potendo così usufruire delle operazioni offerte.<br />
<span id="more-120"></span><br />
Sebbene questo sia il metodo più rapido, ne esiste un altro, impercettibilmente più verboso in termini di codice, attraverso il quale possiamo avere un maggior controllo sul canale di comunicazione.<br />
Riprendendo il progetto di esempio mostrato nella terza parte di questo tutorial, vediamo come modificare il modo in cui connetterci al servizio e come consumarlo:</p>
<pre>//aggiungiamo il seguente riferimento
using System.ServiceModel;

//inseriamo un nuovo Button con il seguente codice nel gestore evento Click:
private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                ChannelFactory&lt;WcfClientApplication.TCP.IServiceClass&gt; factory =
                    new ChannelFactory&lt;IServiceClass&gt;("NetTcpBinding_IServiceClass");
                TCP.IServiceClass channel = factory.CreateChannel();

                channel.CreateDirectoryAndFile("C:\\test", "file.txt");
            }
            catch (CommunicationException exc)
            {
                MessageBox.Show(exc.Message);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }</pre>
<p>Abbiamo instanziato un oggetto di tipo ChannelFactory, il quale ci mette a disposizione una serie di metodi e proprietà per l’apertura e chiusura della connessione, monitorarne lo stato, o per l’impostazione delle credenziali di accesso al servizio.<br />
Nell’esempio è stato invece utilizzato il metodo CreateChannel per ottenere un’istanza ad uno specifico endpoint, quello del nostro server.<br />
Infine, il servizio è stato consumato richiamando il metodo CreateDirectoryAndFile implementato nel nostro WCF service.<br />
Un’ultima considerazione da fare è in merito alla gestione delle eccezioni, dove oltre alla classica Exception è stata aggiunta la cattura di eventuali eccezioni derivanti dalla conessione vera e propria con CommunicationException.</p>
<p><strong>Metodi Asincroni</strong><br />
WCF offre la possibilità di eseguire operazioni in modo asincrono.<br />
Tale modello di programmazione può essere implementato sia lato server, che client.<br />
Una delle cose sicuramente più interessanti consiste nella possibilità di poter invocare un metodo in modo asincrono attraverso il nostro client, nonostante tale metodo non sia stato implementato in un pattern asincrono lato server.</p>
<p>Vediamo subito una dimostrazione di quanto detto.<br />
Riprendiamo il progetto di esempio sviluppato nella terza parte di questo tutorial, avviamo subito il nostro server con F5, quindi apriamo il progetto client.<br />
Nel Solution Explorer espandiamo l’elemento Service References, quindi tasto destro sul sottoelemento TCP e scegliamo la voce Configure Service Referece …<br />
Nella schermata che ci appare mettiamo una spunta in corrispondenza della voce Generate Asynchronous Operations, quindi clicchiamo su Ok.<br />
Questa semplice operazione ci ha dato la possibilità di usufruire di altri metodi relativi al nostro servizio, quelli per l’esecuzione appunto di operazioni asincrone sulle operazioni da noi già implementate.</p>
<p>Posizionamoci nel gestore evento Click dell’unico Button presente nel progetto, eliminiamo tutte le istruzioni contenute all’interno e inseriamo quanto segue:</p>
<pre>ServiceClassClient client = new WcfClientApplication.TCP.ServiceClassClient("NetTcpBinding_IServiceClass");
                <span style="font-size: x-small;">
</span>client.CreateDirectoryAndFileCompleted += new EventHandler&lt;CreateDirectoryAndFileCompletedEventArgs&gt;(client_CreateDirectoryAndFileCompleted);</pre>
<pre>client.CreateDirectoryAndFileAsync(@"C:\WCF_Folder", "WCF_File_Name.txt");</pre>
<p>Non ci resta che implementare il gestore evento CreateDirectoryAndFileCompleted..</p>
<pre>private void client_CreateDirectoryAndFileCompleted(object sender, TCP.CreateDirectoryAndFileCompletedEventArgs e)
        {
            bool result = e.Result;

            if (result) MessageBox.Show("ok..");
        }</pre>
<p>A differenza del progetto originale, questa volta il metodo responsabile della creazione di cartella e file è stato eseguito in modo asincrono.<br />
Terminata l’operazione, l’evento viene attivato e il risultato (ciò che il metodo restituisce) lo recuperiamo proprio all’interno del gestore evento tramite la proprietà Result dell’oggetto CreateDirectoryAndFileCompletedEventArgs.</p>
<p>Stesso risultato possiamo ottenerlo tramite istanza di ChannelFactory:</p>
<pre>//Gestore evento Click</pre>
<pre>EndpointAddress endpointAddress = new EndpointAddress("net.tcp://localhost:12345/TcpBinding");
IServiceClass client = ChannelFactory&lt;IServiceClass&gt;.CreateChannel(new NetTcpBinding(), endpointAddress);
IAsyncResult result = client.BeginCreateDirectoryAndFile("C:\\test", "file.txt", CreateDirectoryAndFileCallBack, client);</pre>
<p>In questo caso abbiamo utilizzato il metodo BeginCreateDirectoryAndFile, dove il terzo parametro passato è la funzione di callback di seguito riportata:</p>
<pre>private void CreateDirectoryAndFileCallBack(IAsyncResult ar)
        {
            bool result = ((TCP.IServiceClass)ar.AsyncState).EndCreateDirectoryAndFile(ar);

            if (result) MessageBox.Show("ok...");
        }</pre>
<p><em>Conclusioni</em><br />
In questa quinta parte del tutorial abbiamo dato un rapido sguardo sulla classe ChannelFactory e su come poter invocare metodi remoti in modo asincrono.<br />
Come sempre, è possibile approfondire gli argomenti e sperimentare con diversi frammenti di codice o interi progetti attraverso MSDN.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/27/wcf-v-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;submitHeadline=WCF+%26%238211%3B+V+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+V+Parte&amp;url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;title=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/27/wcf-v-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/27/wcf-v-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+V+Parte+@+http://visualcsharp.it/news/2009/11/27/wcf-v-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/27/wcf-v-parte/&amp;t=WCF+%26%238211%3B+V+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/27/wcf-v-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accedere a WPF User Interfaces da threads secondari</title>
		<link>http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/</link>
		<comments>http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 12:24:18 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[Windows Forms]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Thread]]></category>
		<category><![CDATA[User Interface]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=112</guid>
		<description><![CDATA[Chi sviluppa abitualmente applicazioni Windows Form ha spesso l’esigenza di implementare uno, o più thread diversi da quello principale, il più delle volte per ragioni di performance  e attraverso essi accedere ai controlli dell’applicazione.

Come tutti ben sanno, tale accesso non può essere eseguito in modo diretto, ma tramite il metodo Inoke o BeginInvoke della [...]]]></description>
			<content:encoded><![CDATA[<p>Chi sviluppa abitualmente applicazioni Windows Form ha spesso l’esigenza di implementare uno, o più thread diversi da quello principale, il più delle volte per ragioni di performance  e attraverso essi accedere ai controlli dell’applicazione.<br />
<span id="more-112"></span><br />
Come tutti ben sanno, tale accesso non può essere eseguito in modo diretto, ma tramite il metodo Inoke o BeginInvoke della classe Control:</p>
<pre>
using System.Threading;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private delegate void HandledOnLabelUpadte();
        Thread th;

        public Form1()
        {
            InitializeComponent();

            th = null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            th = new Thread(Start);
            th.Start();
        }

        private void Start()
        {
            this.Invoke(new HandledOnLabelUpadte(OnLabelUpdate));
        }

        private void OnLabelUpdate()
        {
            label1.Text = "Hello!";
        }
    }
}
</pre>
<p>Al metodo Invoke è stato passato come parametro un delegato che punta alla funzione responsabile dell’aggiornamento del controllo Label.<br />
Nulla di nuovo, questo è ciò che siamo abituati a fare quando intendiamo avere accesso sicuro ad un oggetto Control e suoi derivati.</p>
<p>E in WPF…?<br />
Con l’ultima tecnologia rilasciata da Microsoft dedicata al nuovo tipo di sviluppo di user interface le cose cambiano appena in termini di codice, ma concettualmente non poi così tanto.<br />
L’esempio precedente è qui riproposto in versione WPF Application:</p>
<pre>
using System.Threading;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        private delegate void HandledOnLabelUpadte();
        Thread th;

        public Window1()
        {
            InitializeComponent();
            th = null;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            th = new Thread(Start);
            th.Start();
        }

        private void Start()
        {
            this.Dispatcher.Invoke(new HandledOnLabelUpadte(OnLabelUpdate), System.Windows.Threading.DispatcherPriority.Normal);
        }

        private void OnLabelUpdate()
        {
            label1.Content = "Hello!";
        }
    }
}
</pre>
<p>In questo caso è stato utilizzato il metodo Invoke della classe Dispatcher, inserendo un parametro in più inerente la modalità di accesso all’operazione.</p>
<p>La classe Dispatcher offre diverse funzionalità e ci sarebbe molto altro da dire,<br />
su MSDN è possibile trovare documentazione in abbondanza e di facile comprensione.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;submitHeadline=Accedere+a+WPF+User+Interfaces+da+threads+secondari&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Accedere+a+WPF+User+Interfaces+da+threads+secondari&amp;url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;title=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Accedere+a+WPF+User+Interfaces+da+threads+secondari+@+http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/&amp;t=Accedere+a+WPF+User+Interfaces+da+threads+secondari" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/24/accedere-a-wpf-user-interfaces-da-threads-secondari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; IV Parte</title>
		<link>http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/</link>
		<comments>http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 07:10:42 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=106</guid>
		<description><![CDATA[Nelle precedenti sezioni abbiamo parlato dei WCF Contracts e del ruolo fondamentale che essi intraprendono in questa tecnologia.
Nei due progetti di esempio inoltre abbiamo avuto modo di mettere in pratica, se pur parzialmente, quanto spiegato in linea teorica riguardo la loro implementazione, in particolare quella dei Service Contracts.
In questa parte del tutorial esamineremo un pò [...]]]></description>
			<content:encoded><![CDATA[<p>Nelle precedenti sezioni abbiamo parlato dei WCF Contracts e del ruolo fondamentale che essi intraprendono in questa tecnologia.<br />
Nei due progetti di esempio inoltre abbiamo avuto modo di mettere in pratica, se pur parzialmente, quanto spiegato in linea teorica riguardo la loro implementazione, in particolare quella dei Service Contracts.<br />
In questa parte del tutorial esamineremo un pò più nel dettaglio i Contracts in WCF prestando particolare attenzione ai loro attributi e inserendo vari code snippet per poter meglio comprendere i concetti che verranno esposti.<br />
<span id="more-106"></span><br />
<strong>Service Contracts e Operation Contracts</strong><br />
I Service Contracts rappresentano l’interfaccia esposta dal servizio e ne definiscono le operazioni o i metodi disponibili, nonchè i patterns inerenti lo scambio dei messaggi, ad esempio se questi sono di tipo simplex, duplex, o request-replay.<br />
Eccone un esempio:</p>
<pre>[ServiceContract] //definisce l’interfaccia esposta
Public interface ImyInterface
{
	[OperationContract] //definisce il metodo esposto
	void DoWork();

	double DoAnotherWork();//metodo non esposto dal servizio, quindi non accessibile dalla parte client
}</pre>
<p><em>Parametri per l’Attributo [ServiceContract]</em><br />
CallbackContract: solitamente utilizzato nelle comunicazioni duplex. Il valore di questo parametro dovrebbe genericamente rappresentare il contratto esposto dall’altra parte, cioè dal client:</p>
<pre>[ServiceContract (CallbackContract = typeof(IClientContract))]
Public interface IServerInterface
{
	//…
}</pre>
<p>ConfigurationName: utilizzato per ottenere o impostare la locazione dell’elemento &lt; service&gt; nel file di configurazione.</p>
<p>Name: ottiene o imposta il nome per l’elemento in WSDL.</p>
<p>Namespace: ottiene o imposta il namespace per l’elemento in WSDL. Il valore di default è http://tempuri.org.</p>
<p>ProtectionLevel: questo parametro specifica il livello di protezione richiesto (Sign, EncryptAndSign, None), ad esempio se volessimo specificare che venga richiesta solo una semplice autenticazione scriveremmo qualcosa del genere:</p>
<pre>[ServiceContract (ProtectionLevel = System.Net.Security.ProtectionLevel.None )]
Public interface IServiceClass
{
	//…
}</pre>
<p>SessionMode: specifica un tipo di supporto per le reliable session (implementate nel protocollo WS-Reliable Messaging) che un contratto richiede e che deve poter supportare. Il valore può essere Allowed, NotAllowed e Required:</p>
<pre>[ServiceContract (SessionMode = SessionMode.Required )]
Public interface IServiceClass
{
	//…
}</pre>
<p><em>Parametri per l’Attributo [OperationContract]</em><br />
Action: Ottiene o imposta il WS-Addressing del messaggio richiesto e definisce l’azione che identifica la corrente operazione. WCF usa questa proprietà per determinare a quale metodo inviare il messaggio in arrivo:</p>
<pre>[OperationContract (Action = true)]
void DoSomething(int x, int y);</pre>
<p>AsyncPattern: specifica che un operazione è asincrona, in tal caso il suo valore sarà true.</p>
<p>IsInitiating e IsTerminating: il parametro IsInitiating verifica se un’operazione è consentita per essere eseguita come prima operazione quando viene creata una sessione.<br />
IsTerminating invece determina se l’operazione eseguita terminerà la comunicazione tra i due punti.</p>
<pre>[ServiceContract ]
Public interface IServiceClass
{
	[OperationContract(IsInitiating = true, IsTerminating = false)]
	void Login(user);

	[OperationContract(IsInitiating = false, IsTerminating = false)]
	void DoWork();

	[OperationContract(IsInitiating = false, IsTerminating = true)]
	void Logout(user);
}</pre>
<p>Da notare che se si provasse a chiamare come prima operazione DoWork() o Logout(user) verrebbe restituito un errore, la prima operazione dovrà essere necessariamente Login(user).</p>
<p>IsOneWay: specifica se un’operazione restituisce un messaggio di risposta.</p>
<p>Name: ottiene o imposta il nome dell’operazione sovrascrivendo l’elemento in WSDL.</p>
<p>ProtectionLevel: come per ServiceContract.</p>
<p>ReplayAction: specifica un’azione di risposta per i messaggi in arrivo.</p>
<p><strong>Data Contracts</strong><br />
Il Data Contract descrive il dato che sarà scambiato tra le parti. Per poter inziare la comunicazione, le parti devono “accettare” sul tipo di Data Contract, nello specifico in che modo il dato sarà serializzato e deserializzato (Binario e XML).<br />
A differenza del Service Contract, l’attributo Data Contract non può essere applicato a interfacce, ma solo a classi, strutture ed enumerazioni. Nel seguente esempio si definisce un DataContract e i vari DataMember:</p>
<pre>[DataContract]
public  class MyClass
{
	[DataMember] public string name;
	[DataMember] public int x;
	[DataMember] public bool isMyFriend;
}</pre>
<p><em>Parametri per l’Attributo [DataContract]</em><br />
Name e Namespace: come per ServiceContract.</p>
<p><strong>[DataMember]</strong><br />
Questo attributo si applica a tutti i membri definiti nel DataContract.</p>
<p><em>Parametri per l’attributo [DataMember]</em><br />
EmitDefaultValue: specifica se il valore di default di un campo dovrà essere serializzato.<br />
In .NET i tipi hanno un valore di default, quindi, se avessimo necessità di ridurre la grandezza di un messaggio potremmo impostare a false questo parametro (di default è true):<br />
[DataContract]<br />
public class MyClass<br />
{<br />
[DataMember] public string name= null;<br />
[DataMember] public int count = 0;<br />
[DataMember(EmitDefaultValue = false)] public string Surname = null;<br />
}</p>
<p>IsRequired: informa il serialization model che un data memeber deve essere presente. A false per ometterlo.</p>
<p>Name: come per operation contract.</p>
<p>Order: specifica l’ordine in cui i data members sono serializzati e deserializzati.</p>
<p><strong>Message Contracts </strong><br />
I Message Contracts permettono di ottenere il controllo più completo sui messaggi SOAP.<br />
Nella maggior parte dei casi non sarà necessario lavorare con i Message Contracts, perché di per sé i Data Contract sono già in grado di offrire tutto quello che ci serve.<br />
Tuttavia, avere un controllo su di un livello più basso renderebbe possibile la comunicazione con client e altri sistemi che utilizzino un particolare tipo di WSDL, o per esempio avere la possibilità di interagire con la struttura dei messaggi SOAP per questioni inerenti la sicurezza.<br />
La forma generica di questi attributi non è diversa dagli altri appena visti:</p>
<pre>[MessageContract]
public class MyClass
{
	[MessageHeader]
	public string title;

	[MessageBodyMember]
	public string chapter1;
}</pre>
<p><em>Parametri per l’Attributo [MessageContract]</em><br />
HasProtectionLevel: determina se è impostato un livello di protezione per il messaggio. Se true, indica un livello di protezione esistente, che può essere Encrypted, Signed, o entrambi.</p>
<p>ProtectionLevel: Specifica il livello di protezione per il messaggio:</p>
<p>IsWrapper: se true, indica che il messaggio è wrappato in un documento XML, che contiene l’elemento un elemento wrapper.</p>
<p>WrapperName: implica la presenza del parametro IsWrapper. Se IsWrapper è impostato a true, WrapperName specifica il nome dell’elemento esterno XML:</p>
<pre>[MessageContract (IsWrapped=true, WrapperName=”book”)]
public class Book {…}</pre>
<p>WrapperNamespace: “lavora” con IsWrapper e permette di impostare un namespace per l’elemento wrapper.</p>
<p><strong>Message Header</strong><br />
Questo attributo permette di specificare un campo come intestazione del messaggio SOAP.</p>
<p><em>Parametri per l’Attributo [MessageHeader]</em><br />
Actor: permette di specificare un particolare endpoint come destinatario del messaggio.</p>
<p>MustUnderstand: utilizzato insieme al parametro Actor. Se true, L’URI specificato in actor deve “capire” l’intestazione associata per poterla correttamente processare.</p>
<pre>[MessageContract]
public class MyClass
{
	[MessageHeader(Actor=http://localhost.com/WCF, MustUnderstand=true)]
public string bookName;
}</pre>
<p>Name: specifica il nome dell’elemento del message contract, il quale deve essere un nome XML valido.</p>
<p>Namespace: specifica il nome dell’elemento del namespace del message contract.</p>
<p>Relay: specifica se per l’intestazione è necessario eseguire il relaying.</p>
<p><strong>MessageBodyMember</strong><br />
Questo attributo identifica il corpo (body) di un messaggio SOAP.</p>
<p><em>Parametri per l’Attributo [MessageBodyMember]</em><br />
Name: definisce il nome dell’elemento per tale membro.</p>
<p>Order: specifica l’ordine in cui ogni membro dovrà essere serializzato nel messaggio SOAP:</p>
<pre>[MessageContract]
Public class Books
{
	[MessageHeader]
	public string isbn;

	[MessageHeader(Order=1)]
	public int quantity;

	[MessageHeader(Order=2)]
	public string name;
}</pre>
<p><em>Conclusioni</em><br />
In questa quarta parte del tutorial abbiamo visto come poter utilizzare gli attributi in WCF ed i loro parametri. Nei prossimi articoli avremo modo di implementare tali attributi in progetti più concreti.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;submitHeadline=WCF+%26%238211%3B+IV+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+IV+Parte&amp;url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;title=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+IV+Parte+@+http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/&amp;t=WCF+%26%238211%3B+IV+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/24/wcf-iv-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; III Parte</title>
		<link>http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/</link>
		<comments>http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 13:09:34 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Sorgenti .net]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=93</guid>
		<description><![CDATA[In questa terza e successive parti del tuotiral cercheremo di concretizzare alcuni importanti aspetti teorici definiti nella sezione precedente con esempi pratici.

Un primo frammento di codice è stato riportato nella prima parte del tutorial in cui è stato creato un semplice servizio WCF ospitato in una web application (il server) e consumato da una applicazione [...]]]></description>
			<content:encoded><![CDATA[<p>In questa terza e successive parti del tuotiral cercheremo di concretizzare alcuni importanti aspetti teorici definiti nella sezione precedente con esempi pratici.<br />
<span id="more-93"></span><br />
Un primo frammento di codice è stato riportato nella prima parte del tutorial in cui è stato creato un semplice servizio WCF ospitato in una web application (il server) e consumato da una applicazione windows form (il client) attraverso il protocollo http.</p>
<p>Questa volta, sia il client che il server saranno basati su applicazioni windows e il protocollo di comunicazione utilizzato sarà il TCP, mentre il servizio vero e proprio sarà costruito in una libreria .NET.<br />
Lo scopo del progetto sarà quello di far creare al servizio una directory con un file all’interno secondo le specifiche dettate dal client.</p>
<p><em>NOTA: nell’esempio sottoriportato sarà volutamente omessa una corretta gestione di eventuali eccezioni sollevate dalle applicazioni al fine di poter focalizzare l’attenzione esclusivamente sugli aspetti inerenti WCF.</em></p>
<p><strong>Step 1 – Creazione del servizio</strong><br />
Avviamo Visual Studio e scegliamo la creazione di una libreria di classi dando al progetto il nome di WcfLib.<br />
Aggiungiamo un riferimento al System.ServiceModel, quindi rinominiamo al classe auto-generata da VS in ServiceClass.<br />
Non ci resta che scrivere la nostra solita interfaccia, quindi eseguirne la sua implementazione:</p>
<pre>//vari using inseriti da VS
using System.ServiceModel;
using System.IO;

namespace WcfLib
{
    [ServiceContract]
    public interface IServiceClass
    {
        [OperationContract]
        bool CreateDirectoryAndFile(string directoryName, string fileName);
    }

    public class ServiceClass : IServiceClass
    {
        public bool CreateDirectoryAndFile(string directoryName, string fileName)
        {
            try
            {
                Directory.CreateDirectory(directoryName);

                File.Create(directoryName + "\\" + fileName);

                return true;
            }
            catch { return false; }
        }
    }
}</pre>
<p>Come possiamo vedere abbiamo creato una classe di servizio con un solo metodo all’interno che si occuperà di creare una directory e un file specificati dal client attraverso i parametri che il metodo accetta in ingresso.<br />
Salviamo e compiliamo la soluzione creando così l’assembly WcfLib.dll.</p>
<p><strong>Step 2 – Creazione della Applicazione Host (il server)</strong><br />
Avviamo una seconda istanza di VS e modifichiamo il nome del progetto in WcfServerApplication.<br />
Dal menu project aggiungiamo due riferimenti, uno alla dll creata (WcfLib.dll), l’altro al solito System.ServiceModel.<br />
Aggiungiamo poi una label al nostro form e gestiamo l’evento Form Load e Form Closing:</p>
<pre>//vari using inseriti da VS
using System.ServiceModel;
using System.ServiceModel.Description;
using WcfLib;

namespace WcfServerApplication
{
    public partial class Form1 : Form
    {
	  //oggetto service
        ServiceHost sh;

        public Form1()
        {
            InitializeComponent();

            sh = null;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                //indirizzo URI
                Uri tcpType = new Uri("net.tcp://localhost:12345/TcpBinding");

                //tipo di binding
                NetTcpBinding bindingType = new NetTcpBinding();

                //oggetto behavior utilizzato poi per offrire la possibilità di pubblicare i metadati all'endpoint "mex"
                ServiceMetadataBehavior mBehavior = new ServiceMetadataBehavior();

                //istanza del servizio
                sh = new ServiceHost(typeof(ServiceClass), tcpType);

                //come commentato sulla riga sopra, questa istruzione offre la possibilità di pubblicare i metadati all'endpoint "mex"
                sh.Description.Behaviors.Add(mBehavior);

                //aggiunta di due endpoint al servizio
                sh.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
                sh.AddServiceEndpoint(typeof(IServiceClass), bindingType, tcpType);

                //avvio del servizio
                sh.Open();

                //la lebel inserita nel form informa che il servizio è in esecuzione
                label1.Text = "Started...";
            }
            catch { label1.Text = "Generic Error"; }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //chiudo la connessione
            sh.Close();
        }
    }
}</pre>
<p>I commenti inseriti spiegano esattamente cosa è stato fatto: abbiamo creato un URI per il servizio, impostato il binding, aggiunto gli endpoint e avviato il servizio. Nel gestore evento di chiusura form poi il servizio viene stoppato.<br />
Premiamo F5 e il risultato dovrebbe essere la visualizzazione del Form con la label che visualizza il testo “Started…”. Ovviamente se riceviamo un warning da parte di eventuali firewall installati nel sistema lasciamo pure che l’applicazione acceda alla porta logica 12345.<br />
Ricordate inoltre che qualora ci fosse già un’applicazione in ascolto su tale porta, l’applicazione server andrebbe in errore. In tal caso cambiate il numero porta (compreso tra 1025 e 65535) e ripremete F5.<br />
Lasciamo la windows form in esecuzione e avviamo una terza e ultima istanza di VS per la scrittura del client.</p>
<p><strong>Step 3 – Creazione della Applicazione Client</strong><br />
Avviata la terza istanza di VS, rinominiamo il progetto in WcfClientApplication e dal menu project, scegliamo Add Service Reference.<br />
Nella maschera che ci si presenta (non nuova agli occhi di chi ha letto la prima parte di questo tutorial) aggiungiamo l’indirizzo del nostro servizio (net.tcp://localhost:12345/TcpBinding) e rinominiamo il namespace da ServiceReference1 a TCP. Infine clicchiamo su GO e poi su OK.<br />
Dal Solution Explorer facciamo doppio click sull’app.config e guardiamo un po’ che cosa contiene.<br />
Rivolgiamo la nostra attenzione su due sezioni, quella relativa all’elemento binding e all’elemento endpoint.<br />
Il primo presenta tutta una serie di proprietà impostate di default da WCF, questo perché nel codice della parte host del progetto ci siamo limitati solo ad istanziare un oggetto NetTcpBinding, senza impostare alcuna proprietà tramite l’oggetto ottenuto (il bindingType).<br />
L’elemento endpoint contiene i soliti elementi, tra cui: address, binding e contract.<br />
Notiamo poi un ulteriore elemento, l’ identity, figlio dell’elemento endpoint.<br />
L’idententy property imposta l’indentià per l’endpoint associato al fine di autenticarlo.<br />
In altre parole, questo valore (opzionale) è usato per verficare la validità del servizio. Questa tecnica di autenticazione è solitamente implementata per la prevenzione contro il “phishing”, dove un client potrebbe essere dirottato su di un diverso/non voluto/errato endpoint.</p>
<p>Dal Solution Explorer posizionamoci ora su Form1 e aggiungiamo un Button, quindi doppio click su di esso:</p>
<pre>//vari using di VS
using WcfClientApplication.TCP;

namespace WcfClientApplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //istanza
                ServiceClassClient client = new ServiceClassClient("NetTcpBinding_IServiceClass");

                //esecuzione remota del metodo (immettere un path non esistente)
                bool response = client.CreateDirectoryAndFile(@"C:\WCF_Folder", "WCF_File_Name.txt");

                if (response) MessageBox.Show("OK!");
                else MessageBox.Show("Error");
            }
            catch { MessageBox.Show("Error"); }
        }
    }
}</pre>
<p>Premiamo F5 e clicchiamo sul Button.<br />
Se tutto è andato per il verso giusto come risultato dovremmo visualizzare una messagebox con su scritto OK!.<br />
C’è poco da dire: abbiamo istanziato un oggetto della classe del servizio e chiamato il metodo implementato passando i due parametri richiesti e verificando il valore restituito.</p>
<p><em>Conclusioni</em><br />
In questa terza parte del tutorial abbiamo visto come poter creare e consumare un servizio WCF esclusivamente attraverso codice .NET sfruttando il protocollo TCP.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;submitHeadline=WCF+%26%238211%3B+III+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+III+Parte&amp;url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;title=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+III+Parte+@+http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/&amp;t=WCF+%26%238211%3B+III+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/22/wcf-iii-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; II Parte</title>
		<link>http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/</link>
		<comments>http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 22:31:58 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=74</guid>
		<description><![CDATA[In questa seconda parte del tutorial prenderemo in esame esclusivamente concetti teorici, in particolare vedremo come si compone l’architettura di WCF.

Architettura WCF
WCF si compone sostanzialmente di quattro elementi:
Contracts – definiscono cosa fà un servizio e le informazioni che renderà disponibili.
Service Runtime – definisce il comportamento del servizio durante la sua esecuzione
Messaging – definisce il protocollo [...]]]></description>
			<content:encoded><![CDATA[<p>In questa seconda parte del tutorial prenderemo in esame esclusivamente concetti teorici, in particolare vedremo come si compone l’architettura di WCF.<br />
<span id="more-74"></span></p>
<p><strong>Architettura WCF</strong><br />
WCF si compone sostanzialmente di quattro elementi:<br />
Contracts – definiscono cosa fà un servizio e le informazioni che renderà disponibili.<br />
Service Runtime – definisce il comportamento del servizio durante la sua esecuzione<br />
Messaging – definisce il protocollo di comunicazione e i patterns dei dati scambiati<br />
Activation e Hosting – definiscono opzioni su come un servizio può essere avviato e dove esso sarà ospitato</p>
<p><em>Contracts</em><br />
I contracts definiscono le funzionalità del servizio e le informazioni che renderà disponibili.<br />
WCF mette a disposizione tre tipi di contracts a cui vanno aggiunti aspetti relativi alla sicurezza:<br />
Data: determina i dati che saranno scambiati dal servizio.<br />
Message: fornisce un controllo addizionale sui messaggi, in altre parole permette di personalizzare il tipo di formattazione dei parametri nei messaggi SOAP.<br />
Service: informa i vari clients su cosa l’endpoint ha da offrire.<br />
Policy e Binding: specificano importanti informazioni, tra cui quelle inerenti alla sicurezza.</p>
<p><em>Service Runtime</em><br />
Il service runtime è quella parte del WCF che specifica il comportamento del servizio durante la sua esecuzione in cui distinguiamo elementi come Throttling, Error, Metadata, Istance, Transaction, Dispatch e Concurrency behavior, Message Inspection e Parameter Filtering.</p>
<p><em>Messaging</em><br />
Il messaging definisce il protocollo di comunicazione e i patterns dei dati scambiati.<br />
Il suo layer è composto da diversi canali come il WS Security, WS Reliable Messaging, HTTP, TCP, Transaction Flow, Named Pipe, MSMQ. Troviamo poi gli encoders che forniscono una serie di econding per i nostri messaggi.</p>
<p><em>Activation e Hosting</em><br />
Activation e Hosting definiscono opzioni su come un servizio può essere avviato e dove esso sarà ospitato.<br />
Un servizio WCF può risiedere all’interno di un file EXE, integrato in un’applicazione COM+, o essere eseguito come servizio di windows.</p>
<p><strong>WCF Messages e Transport</strong><br />
I messaggi sono il cuore del WCF, cioè i dati veri e propri che vengono scambiati da un punto ad un altro.<br />
Essi sono tutti SOAP messages formattati in XML. Possiamo quindi intendere un messaggio come un contenitore, il SOAP, al cui interno sono racchiusi gli headers e il body del messaggio.<br />
La comunicazione dei messaggi può avvenire in tre modalità: simplex, duplex e request-reply.<br />
Simplex prevede una comunicazione unidirezionale, il client invia un messaggio al servizio, nient’altro.<br />
Duplex invece implementa una comunicazione bidirezionale, il client può inviare un messaggio al servizio e viceversa.<br />
Request-reply differisce dal tipo duplex in quanto non utilizza una comunicazione bidirezionale: il client invia un messaggio al servizio e resta in attesa della risposta che il servizio invierà.<br />
I protocolli (transport) supportati da WCF per lo scambio dei messaggi sono quattro: HTTP, TCP, MSMQ e Nimed Pipes.<br />
Alcuni di essi integrano una built-in security, HTTPS ad esempio nel caso di HTTP.</p>
<p><strong>Metodologie e Livelli di Programmazione WCF</strong><br />
WCF supporta diversi approcci per lo sviluppo di un servizio, i più comunemente utilizzati sono tre: Declarative, Explicit, Configuration.<br />
Il metodo declarative si realizza attraverso gli attributi usati per definire contracts ed il comportamento del servizio.<br />
Il metodo explicit permette di lavorare sulle classi e interfacce del servizio attraverso Il WCF object model. In altre parole con questo tipo di approccio è possibile ad esempio creare un endpoint, istanziare un servizio ed avviarlo attraverso codice .NET. Questo metodo come è facile intuire offre la massima flessibilità sul WCF programming.<br />
Il Metodo configuration invece fà riferimento al file config di un servzio, attraverso il quale possiamo definire endpoint e altre cose ancora. Uno dei vantaggi sull’utilizzo di questa metodologia sta nel fatto che qualunque tipo di cambiamento sul file config non necessita una ricompilazione del servizio.</p>
<p>La tecnologia WCF offre agli sviluppatori diversi livelli di controllo in riferimento ai tipi di dati, parametri e valori restituiti attraverso il WCF programming model, tra cui: Typed, Untyped e Messaging.<br />
Con un Typed level le operazioni sui servizi sono pressoché identiche a quelle sulle funzioni, con i loro parametri e tipi di dati restituiti.<br />
Al contrario, con Untyped level i parametri e i tipi restituiti di un metodo non sono tipi di dati, ma messaggi.<br />
Infine, con Messaging level è possibile ottenere pieno controllo sotto ogni aspetto sul servizio, come le operazioni sui messaggi , canali e altri dettagli di comunicazione.</p>
<p><strong>Comunicazione tra applicazioni – Endpoint</strong><br />
Come accennato nella prima parte di questo tutorial, per poter comunicare tra loro, le applicazioni che sfruttano la tecnologia WCF utilizzano gli endpoint.<br />
Ogni endpoint è composto da tre elementi: address, binding, contract</p>
<p><em>Address</em><br />
La sintassi generica per la creazione di un address è composta da tre elementi:<br />
protocol type – domainname | machinename [:port] – path<br />
L’elenco seguente mostra il formato corretto per ogni tipo di address:<br />
HTTP &#8211; http://localhost:8080/MyServicePath<br />
HTTPS &#8211; https://localhost:8080/MyServicePath<br />
TCP &#8211; net.tcp:// localhost:8080/MyServicePath</p>
<p>Gli indirizzi MSMQ, Named Pipe e IIS differiscono in alcuni aspetti, vediamo quali:</p>
<p>MSMQ<br />
net.msmq://hostname / [private] / queue-name<br />
net.msmq://localhost/msmqshare/MyQueue</p>
<p>Named Pipe<br />
Come per la sintassi generica, ma senza numero porta:<br />
net.pipe://localhost/MyServicePath</p>
<p>IIS<br />
Un indirizzo IIS richiede una virtual directory e il nome file (.svc) del servizio. Se si omette il numero della porta, ne sarà impostata quella di default, la 80:<br />
http://localhost/MyServicePath/MyServiceFileName.svc -&gt; porta 80 impostata di default<br />
http://localhost:8080/MyServicePath/MyServiceFileName.svc -&gt; numero porta specificato, 8080</p>
<p><em>Binding</em><br />
Il binding, set di proprietà, definisce in che modo un endpoint comunica con il mondo esterno ed ogni endpoint deve averne uno. WCF definisce nove bindings predefiniti:<br />
BasicHttpBinding, WSHttpBinding, WSDualHttpBinding, WSFederationHttpBinding, NetTcpBinding, NetNamedPipeBinding, NetMsmqBinding, NetPeerTcpBinding, MsmgIntegrationBinding.</p>
<p><em>Contracts</em><br />
Come accennato nella prima parte del tutorial, I contracts espongono l’interfaccia del servizio contenente le operazioni offerte. All’inizio di questa seconda parte inoltre abbiamo definito i tre tipi di contracts offerti da WCF, di seguito un breve esempio:</p>
<pre>[ServiceContract]
Interface IServiceTest
{
	[OperationContract]
	void FirstMethod();

	[OperationContract]
	string SecondMethod();

	[OperationContract]
	int ThirdMethod(int x);

	void NotSharedMethod();
}</pre>
<p>In questo esempio abbiamo definito un Service Contracts, ovvero l’interfaccia esposta dal servizio.<br />
I primi tre metodi dichiarati nell’interfaccia sono decorati dall’attributo OperationContract, il che fa sì che tali metodi siano accessibili dalla parte client che raggiungerà e consumerà il servizio.<br />
L’ultimo metodo non presenta alcun attributo, questo vuol dire che a differenza dei primi tre non sarà accessibile dalla parte client.</p>
<p><em>Conclusioni</em><br />
In questa seconda parte del tutorial abbiamo esaminato l’architettura WCF attraverso concetti teorici.<br />
Nei prossimi articoli ci occuperemo di più esempi pratici in grado di comprendere al meglio quanto detto sin’ora.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;submitHeadline=WCF+%26%238211%3B+II+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+II+Parte&amp;url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;title=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+II+Parte+@+http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/&amp;t=WCF+%26%238211%3B+II+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/21/wcf-ii-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF &#8211; I Parte</title>
		<link>http://visualcsharp.it/news/2009/11/20/wcf-i-parte/</link>
		<comments>http://visualcsharp.it/news/2009/11/20/wcf-i-parte/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 21:23:31 +0000</pubDate>
		<dc:creator>Sergio79</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[.Net 3.5]]></category>
		<category><![CDATA[C# 3.0]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/news/?p=50</guid>
		<description><![CDATA[WCF, acronimo di Windows Communication Foundation è una tecnologia Microsoft disponibile a partire dal Framework 3.0 con il principale scopo di rappresentare un modello di comunicazione tra sistemi distribuiti indipendetemente dalle piattaforme su cui ci si trova. Uno degli aspetti certamente più interessanti è che un servizio WCF può essere esposto attraverso quattro diversi protocolli: [...]]]></description>
			<content:encoded><![CDATA[<p>WCF, acronimo di Windows Communication Foundation è una tecnologia Microsoft disponibile a partire dal Framework 3.0 con il principale scopo di rappresentare un modello di comunicazione tra sistemi distribuiti indipendetemente dalle piattaforme su cui ci si trova. Uno degli aspetti certamente più interessanti è che un servizio WCF può essere esposto attraverso quattro diversi protocolli: HTTP, TCP, MSMQ e Named Pipe.<br />
<span id="more-50"></span></p>
<p>Diversamente dalle tradizionali guide, libri di testo e tutorial in genere, in questa prima parte dedicata alla comprensione di Windows Communication Foundation verrà da subito presentato un brevissimo esempio su come creare un semplice servizio WCF e in che modo consumarlo.<br />
Successivamente, verranno analizzati gli aspetti fondamentali di ciò che avremo creato.</p>
<p><em>Costruiamo il primo servizio WCF – (Il nostro server)</em><br />
Apriamo Visual Studio e creiamo un nuovo progetto di tipo Web Application che chiameremo MyFirstWcfService.<br />
Dal menu Project, scegliamo Add New item, quindi selezioniamo WCF Service.<br />
A questo punto l’IDE di Visual Studio ci presenta l’interfaccia del nostro servizio decorata dall’attributo ServiceContract e un metodo  avente come attributo OperationContract.<br />
Modifichiamo tale metodo (void DoWork()) con string DoWork().<br />
Successivamente, dal Solution Explorer espandiamo l’elemento relativo al servizio e cioè Service1.svc, quindi apriamo la classe Service1.svc.cs.<br />
Questa non è altro che la classe creata da VS che eredita dall’interfaccia IService1.cs.<br />
Avendo modificato il metodo dichiarato in tale interfaccia, dobbiamo ovviamente modificarne anche la sua implementazione, quindi da public void DoWork() a public string DoWork() e all’interno scriviamo un’unica istruzione e cioè </p>
<pre name="code" class="c-sharp">return DateTime.Now.ToString();</pre>
<p>Questo è tutto, abbiamo creato il nostro primo servizio WCF ospitato in una pagina web.<br />
Premiamo F5 per andare in debug e come possiamo vedere VS ci presenta una pagina web in cui vengono illustrate info su come testare e consumare il servizio.</p>
<p><em>Consumiamo il nostro primo servizio – (il nostro client)</em><br />
Il server è in esecuzione (modalità di debug), quindi pronto a ricevere connessione da parte del client che ci accingiamo a creare.<br />
Apriamo ancora VS e creiamo una semplicissima Windows Form che chiameremo Client, quindi dal menu Project scegliamo Add Reference Service.<br />
Ci si presenta una finestra dove inserire l’indirizzo del servizio da raggiungere, indirizzo che troviamo nella barra degli indirizzi del Broswer (quella relativa al debug in esecuzione del nostro server).<br />
Copiamo dunque tale indirizzo e lo immettiamo nell’etichetta Address, quindi clicchiamo su Go.<br />
A questo punto il client parte alla ricerca del nostro servizio ed una volta trovato lo riporta nel riquadro Service. Trovato il servizio clicchiamo su Ok e nel Solution Explorer del nostro client troveremo una nuova voce e cioè ServiceReference1.<br />
Non ci resta altro che consumare il servizio, per farlo aggiungiamo un Button alla nostra applicazione, doppio click su di esso e all’interno del gestore evento client scriviamo quanto segue:</p>
<pre name="code" class="c-sharp">
client.Open();
this.Text = client.DoWork();
client.Close();
</pre>
<p>Anche la parte client è terminata, non ci resta altro che testare il nostro servizio, quindi premiamo F5 anche sul progetto Windows Form e clicchiamo sul Button. Il risultato dovrebbe essere la visualizzazione di data e ora sulla barra del titolo del nostro client.</p>
<p>Abbiamo così creato il nostro primo servizio WCF, lo abbiamo ospitato in una pagina web e infine abbiamo usufruito delle sue funzionalità (in questo caso di un solo metodo, il DoWork) attraverso un client implementato come applicazione windows.</p>
<p><em>Un po’ di teoria…</em></p>
<p>Iniziamo a comprendere che cosa abbiamo realizzato analizzando gli aspetti essenziali dei due progetti appena creati.<br />
Dal solution explorer del progetto web apriamo il file web.config, mentre dal solution explorer dell’applicazione windows apriamo l’app.config.<br />
In questi due file di configurazione troviamo un serie di informazioni, tra cui alcune essenziali per il corretto funzionamento della comunicazione tra la parte client e la parte server delle due applicazioni.</p>
<p>La comunicazione tra l’host ed i vari client (possono essere e sono nella realtà più di uno) avviene tramite delle terminazioni dette endpoint.<br />
Un endpoint sostanzialmente “dice” dove si trova il servizio, in che modo lo si deve raggiungere e cosa esso ha da offrire.<br />
Semplificando il tutto possiamo dire che ogni endpoint risponde a tre domande: Dove? Come? Cosa?</p>
<p>I tre elementi fondamentali che formano un endpoint sono:</p>
<p>Address – parametro che identifica la posizione (URI) del servizio e il protocollo utilizzato. (Dove?).<br />
Binding – uno o più elementi per la configurazione del tipo di protocollo di comunicazione utilizzato e per la specifica di impostazioni aggiuntive sul tipo di protocollo scelto. (Come?)<br />
Contract – interfaccia esposta dal servizio che specifica l’elenco delle operazioni offerte. (Cosa?).</p>
<p>Le caratteristiche di ogni endpoint devono essere specificate sia nel file di configurazione dell’applicazione host (il file web.config della nostra applicazione web), sia nel file di configurazione dell’applicazione client (il file app.config della nostra applicazione desktop).</p>
<p><em>Analisi di web.config</em><br />
Tutte le impostazioni e configurazioni relative ai servizi WCF, sia client che server, le troviamo all’interno dell’elemento system.ServiceModel.<br />
Esso contiene poi l’elemento services che a sua volta incorpora uno o più elementi service.</p>
<p>Nel nostro web.config troviamo due importanti attributi nell’elemento service e cioè name e behaviorConfiguration.<br />
Il primo, indica il nome univoco del nostro servizio, il secondo invece rappresenta il nome dell’elemento di configurazione relative al servizio.<br />
Nel nostro esempio il valore di behaviorConfiguration è  MyFirfWcfService.Service1Behavior, riportato di conseguenza come valore dell’attributo name dell’elemento behavior, figlio di serviceBehaviors, sottoelemento di behaviors.</p>
<p>Come possiamo notare abbiamo poi due elementi endpoint, tra cui uno avente come valore dell’attributo address la parola mex. Il mex address non è altro che un endpoint HTTP  usato per ottenere particolari informazioni sul servizio.<br />
Entrambi gli endpoint riportano i tre elementi sopracitati, address, binding e contract.</p>
<p><em>Analisi di app.config</em><br />
Localizziamo il solito system.Servicemodel e posizionamici sull’elemento endpoint, dove troviamo address, binding, contract e due attributi in più: name e bindingConfiguration.<br />
Name identifica in modo univoco l’endpoint, mentre bindingConfiguration contiene il riferimento relativo alla sezione sul tipo di binding da utilizzare con il servizio.<br />
Il valore di bindingConfiguration, WSHttpBinding_IService1 è lo stesso valore dell’attributo name dell’elemento binding, figlio di wsHttpBinding contenuto nella sezione bindings.</p>
<p>Sia nella costruzione della parte host, che client in realtà abbiamo potuto realizzare tutto o quasi in modo visuale e i file di configurazione sono stati creati in automatico.<br />
In realtà avremmo potuto aggiungere parecchie features apportando modifiche sui file config, nelle prossime sezioni vedremo come.</p>
<p><em>Costruzione del servizio</em><br />
Nel momento in cui abbiamo aggiunto il servizio al nostro progetto web, VS ha creato automaticamente l’interfaccia IService1 con un metodo chiamato DoWork.<br />
Come si può notare, l’interfaccia è provvista dell’attributo ServiceContract, mentre il metodo è decorato dall’attributo OperationContract. Grazie ad essi, possiamo utilizzare la classe che eredita dall’interfaccia IService1 nella parte client e usufruire del metodo DoWork.<br />
Nel nostro esempio abbiamo modificato il metodo DoWork affinchè restituisse un valore e infine abbiamo implementato l’interfaccia nella classe Service1.svc.cs.</p>
<p><em>Costruzione del client</em><br />
Per poter usufruire delle funzionalità del nostro servizio abbiamo dovuto aggiungerlo come riferimento, quindi non abbiamo fatto altro che creare un’istanza di Service1Client, aprire la connessione al servizio con il metodo Open, eseguire il metodo DoWork, quindi chiudere la connessione attraverso il metodo Close.</p>
<p><em>Conclusioni</em><br />
In questa prima parte abbiamo visto come creare un semplice servizio WCF ospitato in una pagina web e in che modo poterlo consumare, nel nostro esempio attraverso un‘ applicazione Windows Form, esaminando gli elementi essenziali che compongono il servizo.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2009/11/20/wcf-i-parte/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;submitHeadline=WCF+%26%238211%3B+I+Parte&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=WCF+%26%238211%3B+I+Parte&amp;url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;title=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2009/11/20/wcf-i-parte/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2009/11/20/wcf-i-parte/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+WCF+%26%238211%3B+I+Parte+@+http://visualcsharp.it/news/2009/11/20/wcf-i-parte/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2009/11/20/wcf-i-parte/&amp;t=WCF+%26%238211%3B+I+Parte" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2009/11/20/wcf-i-parte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CsharpRepl: la shell interattiva per C#</title>
		<link>http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/</link>
		<comments>http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 15:50:47 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[CsharpRepl]]></category>
		<category><![CDATA[strumenti]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/2008/09/11/csharprepl-la-shell-interattiva-per-c/</guid>
		<description><![CDATA[Chi programma con linguaggi tipici del mondo Open Source, come Perl, Python, Ruby o Lisp, è abituato da anni ad utilizzare una shell interattiva per provare espressioni ed istruzioni al volo prima di inserirle all&#8217;interno di programmi più corposi. Nel caso di Python, il comando è python, mentre nel caso della versione ufficiale di Ruby [...]]]></description>
			<content:encoded><![CDATA[<p>Chi programma con linguaggi tipici del mondo Open Source, come Perl, Python, Ruby o Lisp, è abituato da anni ad utilizzare una shell interattiva per provare espressioni ed istruzioni al volo prima di inserirle all&#8217;interno di programmi più corposi. Nel caso di Python, il comando è <code>python</code>, mentre nel caso della versione ufficiale di Ruby è <code>irb</code>. Ad esempio, questa potrebbe essere una sessione in Ruby da parte di un principiante:</p>
<pre>
C:\>irb
>> my_string = "visualcsharp.it"
=> "visualcsharp.it"
>> my_string[0,12]
=> "visualcsharp"
>>
</pre>
<p>Questo tipo di shell non fa altro che leggere, valutare le espressioni, stamparne il risultato e poi cominciare da capo. Gli anglofoni direbbero che si tratta del cosiddetto read-eval-print loop (REPL).</p>
<p>C# è sempre stato un linguaggio più statico e rigido rispetto ai linguaggi sopracitati, e la mancanza di una funzione eval vera e propria ha fatto sì che per anni i programmatori C# non potessero avvalersi di uno strumento così utile come la shell interattiva. Gli sviluppatori del progetto Mono, port cross-platform del .NET framework, hanno deciso di cambiare lo status quo nella comunità C# introducendo CsharpRepl, un tool che mancava davvero dalla cassetta degli attrezzi dei dotnettari. Il tutto è possibile grazie ad un&#8217;opportuna modifica al compilatore, per fargli eseguire il codice generato invece di salvarlo in un file. Con CsharpRepl, sarà ora possibile eseguire snippet di codice senza dover compilare ed eseguire l&#8217;intero progetto:</p>
<pre name="code" language="c-sharp">
csharp> using System.IO;
csharp> from f in Directory.GetFiles ("/etc")
      >   let fi = new FileInfo (f)
      >   where fi.LastWriteTime > DateTime.Now-TimeSpan.FromDays(7) select f;
{ "/etc/adjtime", "/etc/asound.state", "/etc/mtab", "/etc/printcap", "/etc/resolv.conf" }
csharp>
</pre>
<p><a href="http://www.mono-project.com/CsharpRepl">La pagina del tool</a> ha maggiori informazioni su come installare e usare il comando <code>csharp</code> (che richiede Mono 2.2).</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Condivi questo articolo:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.bloglines.com/sub/http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/" rel="nofollow" title="Aggiungi a&nbsp;Bloglines"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/bloglines.png" title="Aggiungi a&nbsp;Bloglines" alt="Aggiungi a&nbsp;Bloglines" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;submitHeadline=CsharpRepl%3A+la+shell+interattiva+per+C%23&amp;submitSummary=" rel="nofollow" title="Aggiungi a&nbsp;Buzz"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/buzz.png" title="Aggiungi a&nbsp;Buzz" alt="Aggiungi a&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;Del.icio.us"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/delicious.png" title="Aggiungi a&nbsp;Del.icio.us" alt="Aggiungi a&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;digg"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/digg.png" title="Aggiungi a&nbsp;digg" alt="Aggiungi a&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dotnetkicks.com/kick/?url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;DotNetKicks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Aggiungi a&nbsp;DotNetKicks" alt="Aggiungi a&nbsp;DotNetKicks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=CsharpRepl%3A+la+shell+interattiva+per+C%23&amp;url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;DZone"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/dzone.png" title="Aggiungi a&nbsp;DZone" alt="Aggiungi a&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/" rel="nofollow" title="Aggiungi a&nbsp;Facebook"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/facebook.png" title="Aggiungi a&nbsp;Facebook" alt="Aggiungi a&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;Google Bookmarks"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/google.png" title="Aggiungi a&nbsp;Google Bookmarks" alt="Aggiungi a&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;reddit"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/reddit.png" title="Aggiungi a&nbsp;reddit" alt="Aggiungi a&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;Slashdot"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Aggiungi a&nbsp;Slashdot" alt="Aggiungi a&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;title=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;Stumble Upon"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Aggiungi a&nbsp;Stumble Upon" alt="Aggiungi a&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.squidoo.com/lensmaster/bookmark?http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/" rel="nofollow" title="Aggiungi a&nbsp;Squidoo"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/squidoo.png" title="Aggiungi a&nbsp;Squidoo" alt="Aggiungi a&nbsp;Squidoo" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.sphere.com/sphereit/http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/" rel="nofollow" title="Aggiungi a&nbsp;SphereIt"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/sphereit.png" title="Aggiungi a&nbsp;SphereIt" alt="Aggiungi a&nbsp;SphereIt" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/" rel="nofollow" title="Aggiungi a&nbsp;Technorati"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/technorati.png" title="Aggiungi a&nbsp;Technorati" alt="Aggiungi a&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+CsharpRepl%3A+la+shell+interattiva+per+C%23+@+http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/" rel="nofollow" title="Aggiungi a&nbsp;Twitter"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/twitter.png" title="Aggiungi a&nbsp;Twitter" alt="Aggiungi a&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/&amp;t=CsharpRepl%3A+la+shell+interattiva+per+C%23" rel="nofollow" title="Aggiungi a&nbsp;Yahoo My Web"><img class="social_img" src="http://visualcsharp.it/news/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Aggiungi a&nbsp;Yahoo My Web" alt="Aggiungi a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://visualcsharp.it/news/2008/09/11/csharprepl-la-shell-interattiva-per-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->