<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.devleap.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Claudio Masieri</title><subtitle type="html">SOA, Windows Communication Foundation (WCF), ASP.NET e le Architetture Distribuite</subtitle><id>http://blogs.devleap.com/claudiom/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.devleap.com/claudiom/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.devleap.com/claudiom/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20611.960">Community Server</generator><updated>2005-01-15T14.47.00Z</updated><entry><title>WCF e WS Discovery</title><link rel="alternate" type="text/html" href="http://blogs.devleap.com/claudiom/archive/2008/10/30/wcf-e-ws-discovery.aspx" /><id>http://blogs.devleap.com/claudiom/archive/2008/10/30/wcf-e-ws-discovery.aspx</id><published>2008-10-30T15.05.00Z</published><updated>2008-10-30T15.05.00Z</updated><content type="html">&lt;p&gt;Sto per pubblicare una versione del ws-discovery nuova di zecca su codeproject, ovviamente corredandola con un articolo. &lt;/p&gt;&lt;p&gt;Sono a buon punto con la traduzione, mentre per quel che riguarda l&amp;#39;implementazione:&lt;/p&gt;&lt;p&gt;- il servizio diventa &amp;#39;scopribile&amp;#39; a runtime via configurazione:&lt;/p&gt;&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extensions&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviorExtensions&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name=&amp;quot;serviceDiscoverableBehavior&amp;quot;
type=&amp;quot;Masieri.ServiceModel.WSDiscovery.Behaviors.DiscoveryBehaviorSection,
Masieri.ServiceModel.WSDiscovery, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=18ad931e67d285bd&amp;quot; /&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviorExtensions&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/extensions&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;services&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;service&amp;nbsp; behaviorConfiguration=&amp;quot;serviceDiscoverable&amp;quot; name=&amp;quot;ServiceTest.Istanza&amp;quot;&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;

&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/services&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;e il behavior&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;serviceDiscoverable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;true&amp;quot; httpGetUrl=&amp;quot;http://localhost:8080/Mex&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;serviceDiscoverableBehavior scopesMatchBy=&amp;quot;http://schemas.xmlsoap.org/ws/2005/04/discovery/rfc2396&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scopes&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add url=&amp;quot;http://myscope.tempuri.org/&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/scopes&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/serviceDiscoverableBehavior&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/serviceBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Ha i log nel formato classico del Service Model. &lt;/p&gt;&lt;p&gt; &amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source name=&amp;quot;System.ServiceModel.WSDiscovery&amp;quot; switchValue=&amp;quot;Warning, Error&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listeners&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add initializeData=&amp;quot;InfoServiceDebug.e2e&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
type=&amp;quot;System.Diagnostics.XmlWriterTraceListener, System,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;ServiceModel Listener&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; traceOutputOptions=&amp;quot;LogicalOperationStack,&amp;nbsp; DateTime, Timestamp, ProcessId, ThreadId, Callstack&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/listeners&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/source&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source name=&amp;quot;System.ServiceModel.MessageLogging&amp;quot;&amp;nbsp; switchValue=&amp;quot;Warning, Error&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listeners&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;clear /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add type=&amp;quot;System.Diagnostics.DefaultTraceListener&amp;quot; name=&amp;quot;Default&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; traceOutputOptions=&amp;quot;None&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add initializeData=&amp;quot;MessageLog.e2e&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
type=&amp;quot;System.Diagnostics.XmlWriterTraceListener, System,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;MessageLogging Listener&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; traceOutputOptions=&amp;quot;LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/listeners&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/source&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sharedListeners&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add type=&amp;quot;System.Diagnostics.DefaultTraceListener&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;Default&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sharedListeners&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/system.diagnostics&amp;gt; &lt;/p&gt;&lt;p&gt;- Il client è implementato con la sola interfaccia senza dover far ereditare una classe DiscoveryClient&amp;lt;IServiceSample&amp;gt;() &lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Ha la funzionalità di fault tollerance a livello di chiamata per scalare su altri servizi compatibili, ossia quando esistono piu servizi con la stessa interfaccia&amp;nbsp; se la chiamata su un servizio fallisce, il client ripete automaticamente la chiamata sull&amp;#39;altro&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;- funziona solo senza il discovery proxy. La parte di discovery proxy l&amp;#39;implementerò in futuro&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Spero al più presto di averlo on line&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.devleap.com/aggbug.aspx?PostID=18693" width="1" height="1"&gt;</content><author><name>claudiom</name><uri>http://blogs.devleap.com/members/claudiom.aspx</uri></author><category term="WS-Discovery WCF" scheme="http://blogs.devleap.com/claudiom/archive/tags/WS-Discovery+WCF/default.aspx" /></entry><entry><title>WS-Discovery e WCF</title><link rel="alternate" type="text/html" href="http://blogs.devleap.com/claudiom/archive/2007/02/10/ws-discovery-e-wcf.aspx" /><id>http://blogs.devleap.com/claudiom/archive/2007/02/10/ws-discovery-e-wcf.aspx</id><published>2007-02-10T22.20.00Z</published><updated>2007-02-10T22.20.00Z</updated><content type="html">&lt;P&gt;WS-Discovery è un protocollo WS-* compatibile che permette di utilizzare un servizio, senza&amp;nbsp;specificarne l'indirizzo e il tipo di trasporto.&lt;BR&gt;Di recente ho dovuto implementarlo con WCF e ho pensato di riportare su questo blog le principali problematiche.&lt;/P&gt;
&lt;P&gt;Innanzitutto WS-Discovery, al contrario di WCF, si basa sul contratto e non sulla terna ABC del mondo WCF. Infatti il contratto è l'unico parametro necessario per la ricerca del servizio. Binding e Address saranno determinati dopo la fase di discovery.&lt;/P&gt;
&lt;P&gt;La cosa che mi sarebbe piaciuto fare è un DiscoveryBindingElement che utilizzato da configurazione permettesse di definire il solo contratto. Questo aspetto&amp;nbsp; non è un cambiamento da poco dal punto di vista della configurazione di&amp;nbsp;WCF e ho dovuto abbandonare questa strada&amp;nbsp;in quanto l'ho trovata non percorribile.&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;system.serviceModel&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;extensions&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;bindingExtensions&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;add&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;discoveryBinding&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;type&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;WSDiscovery.Configuration.DiscoverySection, WS-Discovery, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;bindingExtensions&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;extensions&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;client&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;endpoint&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;address&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;discovery://239.255.255.250:3702&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;binding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;discoveryBinding&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;bindingConfiguration&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;discovery&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;contract&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;SampleInterface.IBorsa&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;DiscoveryBinding.Proxy&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;client&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;bindings&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;discoveryBinding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;binding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;discovery&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;discoveryBinding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;scopes&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;mathcBy&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;http://schemas.xmlsoap.org/ws/2004/10/discovery/rfc2396&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;scope&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt;http://mieiscopes.org/urlmioscope&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;scope&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;scopes&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;discoveryBinding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;binding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;discoveryBinding&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;bindings&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;BR&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;system.serviceModel&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;L'alternativa è un&amp;nbsp;proxy che utilizza&amp;nbsp;WS-Discovery implementato tramite una classe astratta, ma anche concreta,&amp;nbsp;del tipo DiscoveryClientBase&amp;lt;TChannel&amp;gt; che ha un costruttore con parametro e un costruttore con un array di scopes (uri che&amp;nbsp;specificano parametri aggiuntivi&amp;nbsp;utili per la scelta del servizio a parità di contratto).&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Un componente di infrastruttura deve essere assolutamente trasparente. Sulle orme della classe ClientBase di WCF ho utilizzato un sistema a proxy dinamici per esporre una proprietà Channel del tipo &amp;lt;TChannel&amp;gt; che permette in modo analogo alla classe ClientBase dirigere tutte le chiamate ai metodi dell'interfaccia ad una funzione "asso piglia tutto" che imbusta fisicamente il messaggio soap e lo invia. Una buona descrizione del metodo dei proxy dinamici è disponibile &lt;A class="" title="Proxy dinamici" href="http://www.codeproject.com/dotnet/dynamicproxy.asp"&gt;qui&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Le cose da tenere conto lato client sono due:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Ogni entry recuperata dal campo va memorizzata in una global storage con tutti i contratti recuperati o pervenuti dal campo (grazie ai messaggi di Hello)&lt;/LI&gt;
&lt;LI&gt;Se dovesse comparire un DiscoveryProxy i meccanismi di trasporto cambiano completamente (unicast-&amp;gt;multicast e viceversa) e quindi bisogna essere pronti all'evenienza&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Il client ha funzioni analoghe quando lavora&amp;nbsp;con la presenza di un&amp;nbsp;discovery proxy e quando questo non è presente: utilizzare uno State (Gof) con una classe astratta che tiene le funzioni comuni e due classi concrete, DiscoveryProxyState e DiscoveryNoProxyState, agevola parecchio il lavoro.&lt;/P&gt;
&lt;P&gt;Una funzione interessante che ho aggiunto nel client è che memorizzando le risposte dal campo è in grado di fornire piu servizi che implementano un contratto. La scelta del contratto da utilizzare è realizzata tramite un componente di riordino, che utilizzando logica di processo esegue il suo lavoro. Nel momento in cui invio un messaggio al servizio e dovessi avere un Fault nella comunicazione la classe proxy automagicamente prova ad usare un'altro servizio presente in lista cancellando quello irraggiungibile. Una funzione banale ma di ottima efficacia e totale trasparenza per l'utilizzatore, avendo tutto mascherato attraverso il dynamic proxy.&lt;/P&gt;
&lt;P&gt;Dedicherò un successivo post per esprimere le mie considerazioni per il lavoro fatto lato servizio.&lt;/P&gt;&lt;img src="http://blogs.devleap.com/aggbug.aspx?PostID=16684" width="1" height="1"&gt;</content><author><name>claudiom</name><uri>http://blogs.devleap.com/members/claudiom.aspx</uri></author><category term="WCF" scheme="http://blogs.devleap.com/claudiom/archive/tags/WCF/default.aspx" /></entry><entry><title>Web controls e caricamento dinamico delle risorse esterne</title><link rel="alternate" type="text/html" href="http://blogs.devleap.com/claudiom/archive/2005/01/15/web-controls-e-caricamento-dinamico-delle-risorse-esterne.aspx" /><id>http://blogs.devleap.com/claudiom/archive/2005/01/15/web-controls-e-caricamento-dinamico-delle-risorse-esterne.aspx</id><published>2005-01-15T14.47.00Z</published><updated>2005-01-15T14.47.00Z</updated><content type="html">&lt;P&gt;Innanzitutto questo è il mio primo post sul mio primo blog e&amp;nbsp;scusate se sono&amp;nbsp;un po impacciato.&lt;/P&gt;
&lt;P&gt;Ho appena terminato uno sviluppo per hobby su un webcontrol. Da quando ho iniziato a sviluppare con HTML ASP &amp;amp; C. ho sempre trovato difficoltà nell'utilizzo di javascript. Per quanto sia da un lato semplicistico, dall'altro è estremamente complicato in quanto ha sempre avuto difficoltà nella portabilità da un browser all'altro (almeno quello che scrivevo io).&lt;BR&gt;La cosa che ho apprezzato per prima di ASP.NET è poter fare a meno di javascript.&lt;BR&gt;ASP.NET in realtà usa javascript nascondendolo all'utente, utilizzandolo per lo stretto necessario (postback, validazioni ...). La potenza di javascript talvolta però mi sorprende. &lt;BR&gt;Di recente vedevo tra i progetti di sourceforge il controllo &lt;A href="http://www.activewidgets.com/"&gt;http://www.activewidgets.com/&lt;/A&gt;&amp;nbsp;che devo dire è fatto in maniera splendida.&lt;BR&gt;Sebbene sembri un activex è fatto interamente in javascript (e per questo mi tolgo il cappello), il problema che da asp.net bisogna un po impegnarsi ogni qualvolta che si intende utilizzarlo.&lt;/P&gt;
&lt;P&gt;L'ideale sarebbe stato avere una grid che esponga la stessa interfaccia della datagrid e che quindi con l'impostazione della datasource con un databind avessi tutto pronto.&lt;/P&gt;
&lt;P&gt;La sfida è ottima e allora mi metto a lavorarci. In primis decido di ereditare mia classe dalla classe Datagrid, poi mi accorgo che non avrei finito entro l'anno con tutte le proprietà da agganciare e allora procedo con un nuovo WebControl implementando le interfacce INamingContainer e IPostBackEventHandler.&lt;/P&gt;
&lt;P&gt;Il mio grosso&amp;nbsp;gruccio&amp;nbsp;non era realizzare il controllo ma evitare che un utente che usa tale controllo dovesse portarsi dietro i numerosi files css e js.&lt;BR&gt;Una idea mi travolse. Perchè non embeddare tutti i filed js e css "statici" internamente al mio controllo e poi richiamarlo dalla reflection? Cosi ho provveduto a creare un HTTPModule che interrogato dalla request provvedesse a recuperare le risorse interne all'assemby.&lt;/P&gt;
&lt;P&gt;In questa maniera il webcontrol può richiedere immagini js e css ad un url fittizzio generando link a risorse tipo Masieri.Web.Control.aspx?res=gird.js e cosi agganciare le risorse esterne.&lt;/P&gt;
&lt;P&gt;Unica precauzione alla richiesta di caricamento del controllo ho dovuto controllare se l'HTTPModule esisteva e in caso negativo emettere un javascript in cui avviso lo sviluppatore di ricordarsi di aggiungere la dichiarazione dell'HttpModule al web.config.&lt;/P&gt;
&lt;P&gt;Ecco&amp;nbsp;il link con un esempio &lt;A href="http://www.noise.it/activegrid/"&gt;http://www.noise.it/activegrid/&lt;/A&gt;, penso che provvedero' ad aprire un apposito progetto su SourceForge dove depositare i sorgenti&lt;/P&gt;&lt;img src="http://blogs.devleap.com/aggbug.aspx?PostID=2419" width="1" height="1"&gt;</content><author><name>claudiom</name><uri>http://blogs.devleap.com/members/claudiom.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.devleap.com/claudiom/archive/tags/ASP.NET/default.aspx" /></entry></feed>