BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

January 2009 - Posts

[OT] Backup dei dischi con Macrium Reflect

Da qualche tempo ero alla ricerca di un buon prodotto per creare le immagini dei dischi. Sono incappato qualche giorno fa in Macrium Reflect. E' davvero un prodotto ben fatto ma soprattutto c'è la versione free.

L'ho già utilizzato per backuppare i miei dischi e fare un ripristino. Lavoro eccellente ed in neanche tanto tempo. L'immagine, tra l'altro, può anche essere aperta con l'Explorer, così magari se vogliamo recuperare singoli files possiamo farlo tranquillamente.

Il Rescue CD è fatto in Linux, ma con interfaccia XP Tongue Tied. Permette anche di creare connessioni di rete "al volo" per recuperare le immagini dalla rete. Altra funzionalità di rilievo.

Non sono stato pagato e non ho ricevuto nulla per questo messaggio, ma faccio con piacere pubblicità al prodotto che merita di essere provato. Anche perchè free... Smile

Posted: Jan 25 2009, 02:27 PM by Fabio.Cozzolino | with 1 comment(s)
Filed under:
[OT] The book is on the table ...

Eccolo Big Smile:

23012009

Finisco di leggere "Ma gli androidi sognano pecore elettriche" e poi passo a questo Stick out tongue...

Ps.: Complimenti Andrea e Dino ...

Posted: Jan 23 2009, 10:55 AM by Fabio.Cozzolino | with 1 comment(s)
Filed under:
[WF] L'ExternalDataExchangeService ed il file di configurazione

Windows Workflow Foundation consente di richiamare classi esterne, chiamate servizi, attraverso l'utilizzo dell'ExternalDataExchangeService. Il servizio ExternalDataExchangeService deve essere istanziato e collegato al WorkflowRuntime prima dell'avvio del workflow. L'uso dal codice è semplice:

1 using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) 2 { 3 ExternalDataExchangeService edes = new ExternalDataExchangeService(); 4 workflowRuntime.AddService(edes); 5 edes.AddService(new ExternalData()); 6 7 WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1)); 8 instance.Start(); 9 } 10

Configurare il tutto da file di configurazione, specialmente se utilizzato con il WorkflowServiceHost, è poco intuitivo. Innanzitutto al nostro servizio aggiungiamo il behaviorConfiguration:

<system.serviceModel> <services> <service name="Workflow1" behaviorConfiguration="workflowRuntimeBehavior"> <endpoint address="http://localhost/MyWorkflow" binding="basicHttpBinding" contract="IWorkflowService"/> </service> </services> ... </system.serviceModel>

Aggiungiamo al config ora la sezione dei behaviors workflowRuntimeBehavior e configuriamo per abilitarne l'utilizzo l'ExternalDataExchangeService:

1 <system.serviceModel> 2 ... 3 4 <behaviors> 5 <serviceBehaviors> 6 <behavior name="workflowRuntimeBehavior"> 7 <workflowRuntime> 8 <services> 9 <add type="System.Workflow.Activities.ExternalDataExchangeService, System.Workflow.Activities, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ConfigurationSection="ExternalDataExchangeService"/> 10 </services> 11 </workflowRuntime> 12 </behavior> 13 </serviceBehaviors> 14 </behaviors> 15 16 </system.serviceModel>

Da notare l'aggiunta del services all'interno del behavior workflowRuntime. Nell'aggiunta dell'ExternalDataExchangeService inseriamo un parametro ConfigurationSection che indica al servizio il nome della sezione di configurazione dalla quale deve recuperare i servizi che devono essere istanziati e gestiti. Il runtime, leggendo dal file di configurazione, istanzia il servizio passando tutti gli attributi del tag add nel costrutture che, a sua volta, si preoccupa di interpretarli. Per fare in modo che questo processo interpreti correttamente anche la sezione da noi indicata, dobbiamo impostare nel file di configurazione il seguente configSection:

1 <configSections> 2 <section name="ExternalDataExchangeService" type="System.Workflow.Activities.ExternalDataExchangeServiceSection, System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 3 </configSections> 4

Ora possiamo scrivere:

1 <configuration> 2 ... 3 4 <ExternalDataExchangeService> 5 <Services> 6 <add type="ExternalService1"/> 7 <add type="ExternalService2"/> 8 </Services> 9 </ExternalDataExchangeService> 10 11 </configuration>

Ed il gioco è fatto.

Posted: Jan 21 2009, 02:30 PM by Fabio.Cozzolino | with no comments
Filed under:
Un'altro modo per recuperare il WorkflowRuntime...

... se vi trovate all'interno di un workflow hostato con WCF (WorkflowServiceHost). Possiamo infatti recuperare, in qualunque momento, il behavior responsabile di gestire il WorkflowRuntime sfruttando l'OperationContext:

1 WorkflowRuntimeBehavior runtimeBehavior = OperationContext.Current.Host.Description.Behaviors.Find<WorkflowRuntimeBehavior>(); 2 if (runtimeBehavior != null) 3 { 4 return runtimeBehavior.WorkflowRuntime; 5 }

Se invece non vi trovate in questo contesto, potete sempre sfruttare l'altro metodo.

Posted: Jan 19 2009, 08:39 PM by Fabio.Cozzolino | with no comments
Filed under:
Rimuovere un servizio windows

Rimuovere un servizio windows è operazione abbastanza semplice. Per chi non lo sapesse si può usare il comando sc.exe con il parametro DELETE:

image

Per informazioni sul comando SC.EXE: http://support.microsoft.com/kb/251192

[WCF] Copiare un messaggio

Lavorando con WCF prima o poi capita di utilizzare la classe Message. La classe è la rappresentazione in memoria del messaggio inviato dal client WCF oppure ricevuto dal servizio WCF. Possiamo interagire con la classe Message per recuperare i suoi headers oppure per ispezionarne il body. Però, mentre gli headers possono essere utilizzati più di una volta, non possiamo accedere al body se questo è stato già letto.

La classe gestisce, internamente, un set di stati:

  • Created
  • Read
  • Written
  • Copied
  • Closed

Se proviamo a leggere il contenuto (body) di un messaggio per due volte, ad esempio:

person1 = message.GetBody<Person>();
...
person2 = message.GetBody<Person>();

la seconda riceveremo un bel:

This message cannot support the operation because it has been read.

dopo la prima lettura, infatti, lo stato del messaggio diventa Read. Sfruttando, invece, la possibilità di creare una copia buffer del messaggio possiamo copiare il messaggio originale ed ottenere quindi una o più copie "riutilizzabili" del messaggio:

Message originalMessage = 
Message.CreateMessage(MessageVersion.Default,
"http://tempuri.org/MyService", new Person { Name = "Fabio" }); Console.WriteLine("OriginalMessage: " + originalMessage.State); MessageBuffer messageBuffer = originalMessage.CreateBufferedCopy(int.MaxValue); Console.WriteLine("OriginalMessage: " + originalMessage.State); Message messageCopy1 = messageBuffer.CreateMessage(); Console.WriteLine("MessageCopy1: " + messageCopy1.State); Message messageCopy2 = messageBuffer.CreateMessage(); Console.WriteLine("MessageCopy2: " + messageCopy2.State); messageBuffer.Close();

l'output in console genera:

image

Il messaggio originale da creato, passa a copiato dopo la chiamata alla CreateBufferedCopy. Le copie, infine, hanno entrambe Created come stato e sono quindi riutilizzabili.

bye

Posted: Jan 17 2009, 10:32 AM by Fabio.Cozzolino | with no comments
Filed under:
Recuperare il WorkflowRuntime da una Activity

Lavorando con Windows Workflow Foundation ho avuto la necessità di ottenere il WorkflowRuntime dall'interno di una activity. Ad un primo impatto non c'è un modo diretto per farlo, ma in realtà è molto semplice. Ho quindi implementato un semplice extension method che restituisce il runtime partendo da una Activity:

static class ActivityExtensions
{
    static WorkflowRuntime GetWorkflowRuntime(this Activity activity)
    {
        DependencyProperty property = 
DependencyProperty.FromName("WorkflowRuntime",
typeof(Activity)); return activity.GetValue(property) as WorkflowRuntime; } }


all'interno di un workflow o di una activity l'extension method può quindi essere utilizzato in questo modo:

WorkflowRuntime runtime = this.GetWorkflowRuntime();

bye

[OT] Ci sono ancora ...

No, per vostra sfortuna non sono scomparso Big Smile. E' solo che dopo un durissimo "tour de force" lavorativo, la ristrutturazione di casa mia e le feste, passate veramente in un lampo, ho avuto davvero poco tempo per fare quello che avrei voluto. E' strano. Ogni volta prima di un periodo di ferie progetto tutto quello che vorrei fare. Avevo in mente:

  • di scrivere un paio di articoli
  • di continuare la serie WCF REST
  • di completare il "restauro" della mia mountain bike
  • di fare un po di sport (footing, bici, partita di tennis...)
  • di completare la lettura di "Gomorra"
  • di scrivere un controllo per WCF REST Starter Kit
  • di fare un paio di modifiche al sito dotnetside.org
  • di godermi qualche bel film

Risultato? Ho scritto solo mezzo articolo Sad ma almeno la ristrutturazione di casa mia è in dirittura d'arrivo (o almeno lo spero).

Quanto a noi di DotNetSide, ci stiamo rimettendo in moto dopo un periodo di pausa. Ho in mente diverse cose che prenderanno forma nei prossimi mesi. Se ci sono proposte di qualunque tipo fatevi pure avanti e non esitate a contattarci, a noi farebbe davvero molto piacere.

I buoni propositi per il nuovo anno sono tanti ed è inutile elencarli. Spero di poterli realizzare con calma e serenità ed auguro lo stesso a tutti voi.

Anche se con qualche giorno di ritardo...Buon Anno!!!