<?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; Articoli</title>
	<atom:link href="http://visualcsharp.it/news/category/articoli/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>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<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 [...]]]></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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F12%2F11%2Fwcf-viii-parte%2F&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>1</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 [...]]]></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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F30%2Fwcf-vi-parte%2F&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 [...]]]></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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F27%2Fwcf-v-parte%2F&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[Windows Forms]]></category>
		<category><![CDATA[WPF]]></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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F24%2Faccedere-a-wpf-user-interfaces-da-threads-secondari%2F&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; 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 [...]]]></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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F22%2Fwcf-iii-parte%2F&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 [...]]]></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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F21%2Fwcf-ii-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2009%2F11%2F20%2Fwcf-i-parte%2F&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>3</slash:comments>
		</item>
		<item>
		<title>Copia/Incolla in DataGridView</title>
		<link>http://visualcsharp.it/news/2008/05/10/copiaincolla-in-datagridview/</link>
		<comments>http://visualcsharp.it/news/2008/05/10/copiaincolla-in-datagridview/#comments</comments>
		<pubDate>Sat, 10 May 2008 08:28:55 +0000</pubDate>
		<dc:creator>Emanuele Origgi</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows Forms]]></category>
		<category><![CDATA[ClipBoardCopyMode]]></category>
		<category><![CDATA[DataGridView]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/2008/05/10/copiaincolla-in-datagridview/</guid>
		<description><![CDATA[Spesso quando si sceglie di usare il controllo DataGridView è perchè non si vuole solo una rappresentazione tabellare dei dati, ma soprattutto perchè si voglione sfruttare funzioni che l’utente medio ritiene tipiche delle tabelle. Una di queste funzioni è sicuramente il copia/incolla di interi record, funzione che non è presente nella classe DataGridView. Ma questo [...]]]></description>
			<content:encoded><![CDATA[<p>Spesso quando si sceglie di usare il controllo DataGridView è perchè non si vuole solo una rappresentazione tabellare dei dati, ma soprattutto perchè si voglione sfruttare funzioni che l’utente medio ritiene tipiche delle tabelle.</p>
<p>Una di queste funzioni è sicuramente il copia/incolla di interi record, funzione che non è presente nella classe DataGridView.</p>
<p>Ma questo non vuol dire che non si possa implementare!<br />
<span id="more-24"></span></p>
<p>Prima di tutto dobbiamo impostare la proprietà ClipboardCopyMode del DataGridView:</p>
<pre name="code" class="c-sharp">
this.dataGridView.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
</pre>
<p>L’enumerazione DataGridViewClipboardCopyMode contiene quattro valori: con EnableWithoutHeaderText è possibile copiare negli Appunti i valori di testo delle celle selezionate. Il testo dell&#8217;intestazione non viene incluso.</p>
<p>Andiamo ora a implementare i metodi Copia e Incolla.<br />
Il metodo Copia è semplicissimo:</p>
<pre name="code" class="c-sharp">
private void Copia()
{
    Clipboard.SetDataObject(this.dataGridView.GetClipboardContent());
}
</pre>
<p>Con questo codice viene copiato nella Clipboard, attraverso il metodo static Clipboard.SetDataObject, i dati che tornano dal metodo GetClipboardContent() della classe DataGridView. Dati che vengono formattati in base al valore della proprietà ClipboardCopyMode.</p>
<p>Purtroppo il metodo Incolla non è così immediato:</p>
<pre name="code" class="c-sharp">
        private void Incolla()
        {
            char[] rowSplitter = { '\r', '\n' };
            char[] columnsSplitter = { '\t' };
            string[] campi;
            //Ottengo le informazioni contenute negli appunti
            string appunti = Clipboard.GetText();
            //Divido gli appunti in righe
            string[] righe = appunti.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries); 

            foreach (string str in righe)
            {
                //Divido la stringa in campi e aggiungo la riga del DataGridView
                campi = str.Split(columnsSplitter);
                if (campi.Length == 2)
                {
                    this.bindingSource.AddNew();
                    DataRowView rowView =
                            (DataRowView)this.bindingSource.Current; 

                    if (campi[3] == String.Empty)
                        rowView[5] = DBNull.Value;
                    else
                        rowView[5] = int.Parse(campi[3]); 

                    if (campi[4] == String.Empty)
                        rowView[4] = DBNull.Value;
                    else
                        rowView[4] = int.Parse(campi[4]);
                }
            }
        }
</pre>
<p>Il procedimento è però abbastanza semplice: prima di tutto otteniamo i dati presenti nella Clipboard attraverso il metodo statico Clipboard.GetText(). Quindi i dati così ottenuti vengono divisi prima in righe, splittandoli sui valori &#8216;\r&#8217; &#8216;\n&#8217;, e in seguito vengono splittati in colonne (\t). I dati così ottenuti vengono inseriti nel controllo DataGridView.</p>
<p>A questo punto resta da implementare solo il ContextMenu che conterrà i menu Copia e Incolla con i rispettivi eventi Click che richiamano i metodi Copia e Incolla.</p>
<p>Per fare questo si deve prima aggiungere un ContextMenu al progetto e poi associarlo al controllo DataGridView intercettando l’evento RowContextMenuStripNeeded del DataGridView stesso:</p>
<pre name="code" class="c-sharp">
        private void dataGridView_RowContextMenuStripNeeded(object sender, DataGridViewRowContextMenuStripNeededEventArgs e)
        {
            e.ContextMenuStrip = this.contextMenuCopiaIncolla;
        }</pre>
<p>Praticamente, ogni volta che si preme col tasto destro sul DataGridView, viene generato l’evento RowContextMenuStripNeeded che imposta la proprietà e.ContextMenuStrip sul contextMenu che contiene i menu Copia e Incolla.</p>
<p>Questo codice è solo un esempio. Il metodo Incolla si può adattare in base alle esigenze: per esempio si può valorizzare la chiave primaria se presente, oppure si può decidere di includere nella ClipBoard anche l&#8217;intestazione delle colonne e quindi incollare tutto in Excel.</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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;submitHeadline=Copia%2FIncolla+in+DataGridView&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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=Copia%2FIncolla+in+DataGridView&amp;url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;title=Copia%2FIncolla+in+DataGridView" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F" 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+Copia%2FIncolla+in+DataGridView+@+http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F05%2F10%2Fcopiaincolla-in-datagridview%2F&amp;t=Copia%2FIncolla+in+DataGridView" 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/05/10/copiaincolla-in-datagridview/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>C# 3.0: Extension Methods</title>
		<link>http://visualcsharp.it/news/2008/02/20/c-30-extension-methods/</link>
		<comments>http://visualcsharp.it/news/2008/02/20/c-30-extension-methods/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 21:13:02 +0000</pubDate>
		<dc:creator>Emanuele Origgi</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Extension Methods]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/2008/02/20/c-30-extension-methods/</guid>
		<description><![CDATA[Gli Extension Methods permettono di aggiungere metodi a tipi già definiti, senza creare un nuovo tipo derivato. Questo vale sia per le classi del Framework sia ovviamente per le classi da noi create e sono una forma molto speciale di metodi statici, che vengono però chiamati come se fossero a tutti gli effetti dei metodi [...]]]></description>
			<content:encoded><![CDATA[<p>Gli Extension Methods permettono di aggiungere metodi a tipi già definiti, senza creare un nuovo tipo derivato. Questo vale sia per le classi del Framework sia ovviamente per le classi da noi create e sono una forma molto speciale di metodi statici, che vengono però chiamati come se fossero a tutti gli effetti dei metodi di istanza.<br />
<span id="more-21"></span><br />
Un esempio potrebbe essere quello di “estendere” la classe String, aggiungendo un nostro metodo ContaVocali. </p>
<pre name="code" class="c-sharp">
namespace Extensions
{
    static class StringExtension
    {
        ///
<summary>
        /// Conta quante vocali sono presenti.
        /// </summary>

        public static int ContaVocali(this String str)
        {
            // Codice che conta quante vocali sono presenti in str...
        }
    }
}
</pre>
<p>All’interno del namespace Extensions è presenta una classe statica StringExtension con un metodo static ContaVocali. Questo metodo è esattamente come un normalissimo metodo statico, con una caratteristica in più: la presenza della keyword this al primo parametro. E’ infatti grazie a questo parametro che viene indicato al compliatore di C# che tipo si vuole estendere, in questo caso la classe String.</p>
<p>Ora si può chiamare il metodo ContaVocali come se fosse un normalissimo metodo di istanza di String:</p>
<pre name="code" class="c-sharp">
using Extensions;
static void Main()
{
    string prova = “ciao”;
    int numVocali = prova.ContaVocali();
}
</pre>
<p>Da notare che ho fatto riferimento al namespace nel quale è contenuto l’extension method, altrimenti non sarebbe stato visibile.</p>
<p>Altra nota da sottolienare è che gli extensions methods non violano il concetto di incapsulamento perché, essendo in realta dei metodi statici, non possono vedere i campi privati di istanza della classe che estendono.</p>
<p>Questa nuova funzionalitàdi C# può sembrare un pò inutile, ma non si deve andare tanto lontano per trovare un loro utilizzo pratico: LINQ si basa fortemente sugli Extensions Methods!<br />
L’importante è saperli usare con moderazione e dove strettamente necessario, ricordando che il miglior modo per estendere un tipo è quello di usare l’ereditarietà.</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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;submitHeadline=C%23+3.0%3A+Extension+Methods&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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=C%23+3.0%3A+Extension+Methods&amp;url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;title=C%23+3.0%3A+Extension+Methods" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F" 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+C%23+3.0%3A+Extension+Methods+@+http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F20%2Fc-30-extension-methods%2F&amp;t=C%23+3.0%3A+Extension+Methods" 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/02/20/c-30-extension-methods/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C# 3.0: Implicitly typed local variables</title>
		<link>http://visualcsharp.it/news/2008/02/12/implicitly-typed-local-variables/</link>
		<comments>http://visualcsharp.it/news/2008/02/12/implicitly-typed-local-variables/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 20:57:04 +0000</pubDate>
		<dc:creator>Emanuele Origgi</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# 3.0]]></category>
		<category><![CDATA[Implicitly typed local variables]]></category>
		<category><![CDATA[var]]></category>

		<guid isPermaLink="false">http://visualcsharp.it/2008/02/12/implicitly-typed-local-variables/</guid>
		<description><![CDATA[Una delle nuove funzionalità di C# 3.0 sono le Implicitly typed local variables, dove il tipo della variabile viene dedotto dal compilatore in fase di compilazione del codice in IL. Per usare le variabili implicite si deve usare la parola chiave var: var i = 5; var s = “ciao”; var numeri = new int[] [...]]]></description>
			<content:encoded><![CDATA[<p>Una delle nuove funzionalità di C# 3.0 sono le Implicitly typed local variables, dove il tipo della variabile viene dedotto dal compilatore in fase di compilazione del codice in IL.<br />
Per usare le variabili implicite si deve usare la parola chiave var:<br />
<span id="more-19"></span></p>
<pre name="code" class="c-sharp">
var  i = 5;
var s = “ciao”;
var numeri = new int[] {1, 2, 3};
var conn = new OleDbConnection();
</pre>
<p>Nonostante sembri il contrario il codice sopra è fortemente tipizzato, perché, come ho già detto, il tipo viene scelto dal compilatore.<br />
Se infatti in Visual Studio si posiziona il cursore sulla parola var, l’IntelliSense ci indica il tipo effettivo della variabile.<br />
Proprio per questo il tipo della variabile non può &#8220;variare&#8221;:</p>
<pre name="code" class="c-sharp">
var i = 5;
i = “Ciao” //Errore: Impossibile convertire in modo implicito il tipo String in int
var i = null; //Errore
</pre>
<p>Per poter usare le Implicitly typed local variables si devono seguire delle semplici regole:</p>
<ul>
<li>Ovviamente, come dice il nome, non possono essere variabili globali ma solo locali;</li>
<li>La dichiarazione deve includere un inizializzatore. Per esempio il seguente codice darebbe errore:
<pre name="code" class="c-sharp">var i; //Errore </pre>
</li>
<li>L’inizializzatore deve essere un’espressione. Non può essere un oggetto
<pre name="code" class="c-sharp">
OleDbConnection conn;
OleDbConnection conn2 = new OleDbConnection();
var c = conn; //Errore
var c2 = conn2; //GIUSTO</pre>
</li>
<li>Le variabili implicite non accettano valori null</li>
</ul>
<p>L’utilizzo di var diventa comodissimo nei cicli foreach. Per esempio:</p>
<pre name="code" class="c-sharp">
int[] numeri = {1,2, 3};
foreach(var n in numeri)
	//fai qualcosa
</pre>
<p>Un’ultima osservazione: in C# 3.0 questo codice</p>
<pre name="code" class="c-sharp">
            int var = 5;
            var k = var;
</pre>
<p>funziona perfettamente!</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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;submitHeadline=C%23+3.0%3A+Implicitly+typed+local+variables&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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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=C%23+3.0%3A+Implicitly+typed+local+variables&amp;url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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?url=http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;title=C%23+3.0%3A+Implicitly+typed+local+variables" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F" 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+C%23+3.0%3A+Implicitly+typed+local+variables+@+http%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F" 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%3A%2F%2Fvisualcsharp.it%2Fnews%2F2008%2F02%2F12%2Fimplicitly-typed-local-variables%2F&amp;t=C%23+3.0%3A+Implicitly+typed+local+variables" 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/02/12/implicitly-typed-local-variables/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! -->
