BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

April 2009 - Posts

Microsoft.Jet.OLEDB.4.0 su x64

Oggi mi sono imbattuto in questo errore:

The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine

L’errore si verifica, almeno nel mio caso, eseguendo un’applicazione .NET su un server x64. La soluzione è semplice, basta forzare il target dell’applicazione su x86 e tutto torna poi a funzionare come dovrebbe.

image

Ciauz

Workshop “Sviluppare applicazioni di qualità in .NET”

”The Times They Are A-Changin'”, sulle note di una canzone di Bob Dylan annunciamo il prossimo workshop .netSide: “Sviluppare applicazioni di qualità in .NET”.

In questo incontro parliamo di patterns, best practices, testing, etc,.. tutti ingredienti che portano allo “sviluppo di applicazioni moderne che puntano ad alti livelli di affidabilità e stabilità, oltre a portare all'abbattimento dei costi di manutenzione”: Dopo l’intervento del già collaudato MVP Vito Arconzo, vedremo il debutto di Mario Ferrante, collaboratore importante nelle dinamiche del gruppo che ora ha finalmente deciso di mettersi in prima linea. Grande Mario !!!

Infine, ma assolutamente non per ultimo, chiuderà l’evento Lorenzo Barbieri di Microsoft, che di sicuro non ha bisogno di presentazioni grazie anche ai suoi numerosi contributi dati in passato alla community.

Fissate quindi la data: 15 Maggio 2009 ore 14:30, presso la sede di Tecnopolis a Valenzano (BA). Non vi resta che consultare l’agenda e registrarvi!!

Ciauz … Big Smile.

[WCF] Chiudere correttamente il client

Uno degli usi più comuni ed allo stesso tempo più errati di un client WCF è l’utilizzo di un blocco using. Vediamo perchè un codice come questo è errato:

  1: using (MyClient client = new MyClient())
  2: {
  3:     client.RemoteOperation();
  4: }

che, quando compilato, viene tradotto in questo:

  1: MyClient client = new MyClient();
  2: try
  3: {
  4:     client.RemoteOperation();
  5: }
  6: finally
  7: {
  8:     ((IDisposable)client).Dispose();
  9: }

Qui, però, abbiamo un problemino. Se il client termina correttamente la chiamata, infatti, la dispose tenta di chiudere il channel, e questo è giusto. Ma se la comunicazione va in eccezione, allora la dispose tenterà comunque di chiudere il channel, generando quindi una nuova eccezione proprio perchè un channel in stato Faulted non può passare in stato Closed. L’eccezione generata è infatti:

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

Come fare quindi? Semplice non usare lo using e “tornare” al classico “try..catch” esplicito:

  1: MyClient client = new MyClient();
  2: try
  3: {
  4:     client.RemoteOperation();
  5:     client.Close();
  6: }
  7: catch (Exception ex)
  8: {
  9:     client.Abort();
 10: }

in questo modo chiudiamo correttamente il channel mettendolo in Closed, effettuando però una serie di operazioni come il disposing dei vari channel utilizzati, la chiusura della sessione corrente (se utilizzata), la chiusura di eventuali transazioni ancora in piedi, etc….

Queste stesse operazioni vengono eseguite anche dalla close, ma chiaramente con le differenze del caso dovute alle specifiche implementazioni dei vari channel coinvolti. Tenendo presente come è composto il channel layer di WCF, è chiaro che quando viene invocato l’Abort o il Close sul client, questo viene propagato verso tutti i vari channels, generando quindi comportamenti differenti sulla base dello specifico channel.

Alcuni riferimenti:
http://msdn.microsoft.com/en-us/library/aa355056.aspx
http://msdn.microsoft.com/en-us/library/aa354510.aspx

Posted: Apr 14 2009, 09:52 PM by Fabio.Cozzolino | with no comments
Filed under:
Velocity CTP3

Rilasciata da poche ore la CTP3 di "Velocity", il tool per la cache distribuita sviluppato da Microsoft:

For community technology preview 3 (CTP3), Microsoft project code named "Velocity" offers several enhancements and revised APIs. The enhancements include cache notifications feature, performance improvements, security enhancements, and new cluster management options. There have also been updates to the installation program.

L'annuncio ufficiale sul blog del team: http://blogs.msdn.com/velocity/

Download Microsoft Project Code Named "Velocity" Community Technology Preview 3

[Extension Methods] Aggiungere un nuovo MessageInterceptor

Gli Extension Methods mi piacciono parecchio. Li ritengo molto utili e comodi con il fine di rendere immediate e più semplici determinate operazioni che potrei definire “ripetitive”. Oggi, dopo l’ennesimo MessageInterceptor creato ed aggiunto ad un service host, mi sono deciso a creare un Extension Method per semplificarmi la vita:

  1: public static class ServiceModelExtensions
  2: {
  3:     public static void AttachInterceptor(this ServiceHostBase host, IDispatchMessageInspector inspector)
  4:     {
  5:         foreach (ChannelDispatcher channelDispatcher in host.ChannelDispatchers)
  6:         {
  7:             foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
  8:             {
  9:                 endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
 10:             }
 11:         }
 12:     }
 13: 
 14:     public static void AttachInterceptor(this ServiceHostBase host, Type inspectorType)
 15:     {
 16:         if (inspectorType.HasInterface(typeof(IDispatchMessageInspector)))
 17:         {
 18:             throw new Exception("Il tipo richiesto non implementa l'interfaccia 'IDispatchMessageInspector'.");
 19:         }
 20: 
 21:         IDispatchMessageInspector inspector = (IDispatchMessageInspector) Activator.CreateInstance(inspectorType);
 22:         foreach (ChannelDispatcher channelDispatcher in host.ChannelDispatchers)
 23:         {
 24:             foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
 25:             {
 26:                 endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
 27:             }
 28:         }
 29:     }
 30: 
 31:     public static bool HasInterface(this Type type, Type interfaceType)
 32:     {
 33:         return type.GetInterfaces().Any(t => t == interfaceType);
 34:     }
 35: }

L’extension method può poi essere utilizzato così:

  1: public class LoggerServiceBehavior : IServiceBehavior
  2: {
  3:     public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  4:     {
  5:     }
  6: 
  7:     public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
  8:     {
  9:     }
 10: 
 11:     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
 12:     {
 13:         serviceHostBase.AttachInterceptor(typeof(LoggerMessageInterceptor));
 14:     }
 15: }

A mio parere viene semplificata notevolmente la leggibilità del codice. Un’altro esempio dell’utilità degli extension methods. Ovvio, come in ogni cosa, non bisogna abusarne… Wink

WCF Champ vs The Contender

C’è una battaglia in atto ... chi la spunterà ?? Big Smile

Simpatica, vero??

Posted: Apr 04 2009, 08:41 PM by Fabio.Cozzolino | with no comments
Filed under: , ,
MSDN low-band view

L’ho notato solo oggi, probabilmente è attivo solo da qualche giorno, ma la nuova low-band view del sito MSDN mi piace parecchio.

image

image

Più fluida, semplice, diretta ai contenuti. Non so … mi ci trovo meglio e mi sa che la renderò persistente … Stick out tongue

Posted: Apr 04 2009, 12:37 AM by Fabio.Cozzolino | with no comments
Filed under:
Windows 7 Installation Fest: Registrazioni video

Se vi siete persi l’evento, Francesco Renzo ha registrato la sessione e pubblicato il video su Vimeo.

Ringrazio davvero Francesco per la registrazione, promosso a pieni voti come reporter ufficiale DotNetSide Big Smile. Io intanto mi scuso con tutti per la mia mancata partecipazione, purtroppo per problemi lavorativi non ho potuto prendere parte all’evento. Cercherò di farmi perdonare… Smile