BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

December 2007 - Posts

[OT] aNobii: libreria online ...

Dopo aver pubblicato il mio ultimo post, stavo leggendo il blog di Andrea Angella è l'occhio mi è capitato sulla lista di libri presente ai lati. aNobii?? Vediamo...

Bè, è possibile gestire la tua libreria online, tutte le info sui libri, quando li hai letti, il tuo voto, le tue annotazioni. E' possibile renderle o meno pubbliche. E' veramente semplice da utilizzare e ben fatto. Peccato che l'attuale versione di Community Server su cui gira .netSide non consente il corretto inserimento del badge, uno script che permette di visualizzare l'elenco dei libri sul blog. In attesa della nuova versione di CS (a breve, spero Big Smile) ho semplicemente modificato il link "Leggere, che passione..." per farlo puntare alla mia libreria su aNobii.

bye

[OT] Leggere, che passione...

In questo periodo di festa un OT è quasi la regola. Mi sto "disintossicando" da molte cose con l'obiettivo di ripartire, il 2 Gennaio, con più forza e convinzione. Sto finalmente dedicando molte più tempo del solito, della mia giornata, alla lettura. Mi piace. E' bello sentirsi, almeno per un po, da un'altra parte. Osservatore e critico di storie non tue. Ci sono quelle che ti appassionano, che leggi con interesse. Ma ci sono anche quelle che non ti prendono. Personalmente non mi soffermo su un genere in particolare (anche se preferisco i thriller o i legal-thriller, se fatti bene), mi piace sperimentare. Leggere di tutto.

Attualmente sto leggendo "Il lupo della steppa" di Herman Hesse. Impegnativo, vero, ma è incredibile come certi libri sono sempre attuali, anche se scritti quasi 100 anni prima ed in circostanze completamente diverse da quelle che attualmente stiamo vivendo. A volte mi ci rivedo, in Harry.

Prima, divorato in pochi giorni, ho letto "Ragionevoli dubbi" di Gianrico Carofiglio. Mi piace il suo modo di scrivere, il modo in cui vengono raccontati i fatti visti dagli occhi del suo protagonista, l'Avvocato Guerrieri. Un "eroe" con le sue disavventure, con i suoi dubbi e che combatte continuamente con le sue vicende personali. Personaggi verosimili. Poi, i romanzi sono ambientati a Bari, il che aggiunge un pizzico di sano campanilismo Big Smile. Venerdì scorso hanno trasmesso su canale 5 la trasposizione sul piccolo schermo del primo romanzo, "Testimone Inconsapevole". Il 2 di gennaio ci sarà "Ad occhi chiusi". Entrambi sono ambientati a Trani, la mia città di adozione.

Da qualche mese ho raccolto i titoli letti negli ultimi due anni e la cosiddetta "pila" dei libri da leggere in un unica pagina rendendo disponibile il link a lato del mio blog, magari a qualcuno può interessare Big Smile.

Vi lascio con la mia lista, ristretta e quasi involontariamente distinta per generi, di 5 libri da leggere (ovviamente tra quelli che ho letto):

  1. Siddharta (Herman Hesse)
  2. Testimone inconsapevole (G.Carofiglio)
  3. Il profumo (Patrick Suskind)
  4. Molte vite, molti maestri (Brian Weiss)
  5. Il codice da Vinci (Dan Brown)

E la vostra lista?

[WCF] File di configurazione "esterni"

Pablo Cibraro, dopo uno scambio di mail con in seguito a questo mio precedente post, mi segnala un'alternativa alla soluzione implementata: l'utilizzo del configSource. L'attributo configSource, introdotto con il .NET Framework 2.0, consente di specificare un file di configurazione esterno come contenitore di quella specifica sezione.

Scrivendo infatti nel config:

<miasezione configSource="altro.config"/>

indichiamo che il file altro.config contiene la sezione miasezione. Lo stesso meccanismo è applicabile anche nelle sezioni di configurazione di WCF come in qualsiasi altra sezione. Il tutto è perfettamente descritto in questo post di Pablo. La sostanziale differenza tra le due soluzioni è dovuta al fatto che lo UniqueConfigServiceHost consente di scrivere completamente la sezione system.serviceModel in un file di configurazione esterno, ma la cosa più importante è quella di consentire il merge dei file. Potremmo, in teoria, avere un file con un set di behaviors ed un secondo file che ne contiene un altro set. Troppo incasinato? Probabile ma sappiamo che gli scenari talvolta sono così complessi che ci possono portare ad adottare soluzioni come queste.

Di certo non credo di poter risolvere tutti i problemi con il codice pubblicato, il cui scopo è quello di fornire spunti di studio ed approfondimento, ma era giusto anche riportare questa soluzione che probabilmente sfugge e che può essere risolutiva in molti scenari.

Technorati Tags:

Posted: Dec 22 2007, 01:07 PM by Fabio.Cozzolino | with no comments
Filed under:
[OT] BUON NATALE !!!

A tutti !!!

image

Ps.: Ovviamente l'immagine non è del tutto casuale ... Big Smile 

Posted: Dec 21 2007, 01:47 AM by Fabio.Cozzolino | with no comments
Filed under: ,
[WCF] Custom ServiceCredentials e SecureConversation

Un problema mi stava ultimamente attanagliando. Sempre più crescente. Ne rimandavo la risoluzione perchè apparentemente inspiegabile. Dopo aver implementato un CustomServiceCredentials (che magari sarà oggetto di un post dedicato) ed abilitato l'uso di WS-SecureConversation, il servizio aveva inspiegabilmente di funzionare, restituendo l'errore:

There was no channel that could accept the message with action 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT'.

Provando a ripristinare il ServiceCredentials di default tutto tornava a funzionare regolarmente. Eppure il mio CustomServiceCredentials non fa nulla di male se non creare un CustomServiceCredentialsSecurityTokenManager che a sua volta istanzia CustomTokenAuthenticator. Il problema era invece di semplice e rapida risoluzione. Ovviamente nell'override di ogni metodo ed in particolare CreateSecurityTokenAuthenticator del CustomServiceCredentialsSecurityTokenManager io richiamavo ogni volta l'implementazione del metodo base. Mia intenzione, però, era la semplice gestione di alcuni token particolari (es.: username). Ma il meccanismo di WS-SecureConversation e di tutte quelle modalità che prevedono una negoziazione (Spnego, Tlsnego, etc) prevedono l'implementazione di una particolare interfaccia, IIssuanceSecurityTokenAuthenticator, e la gestione diretta delle richieste con l'implementazione di un particolare CommunicationObject, oltre ad una serie di altri accorgimenti inutili da elencare.

Ovviamente non andavo a fare tutte queste cose nel mio "povero" CustomTokenAuthenticator e WCF reagiva male perchè non era in grado di trovare un opportuno endpoint "incarnato" nel relativo CommunicationObject per gestire la action.

E' invece giusto che l'implementazione rimanga in carico al framework perciò nel mio CustomServiceCredentialsSecurityTokenManager ho riportato la seguente modifica:

 

public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
{
SecurityTokenAuthenticator innerAuthenticator
= base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
if (innerAuthenticator is IIssuanceSecurityTokenAuthenticator)
return innerAuthenticator;
else
return new CustomTokenAuthenticator(innerAuthenticator);
}

Utilizzando il SecurityTokenAuthenticator  restituito dal metodo base CreateSecurityTokenAuthenticator per SecureConversation e il mio CustomTokenAutenticator, a sua volta estensione di SecurityTokenAuthenticator, per le altre implementazioni.

ciauz

Technorati Tags:
Posted: Dec 20 2007, 02:55 PM by Fabio.Cozzolino | with no comments
Filed under:
Application Platform Roadshow - Post event

Mercoledì a Bari c'è stata l'ultima tappa dell'Application Platform Roadshow. Purtroppo per impegni lavorativi sono riuscito ad esserci solo nel pomeriggio, seguendo le due sessioni di Dino e Lorenzo, due "pezzi da novanta". Il tempo a disposizione era veramente poco. Difficile scendere in un buon dettaglio di informazioni in così poco tempo. Posso dire però che le sessioni sono state interessanti soprattuto grazie alla bravura degli speaker capaci di dare una visione di insieme di quanto gli strumenti ci mettono a disposizione.

E' comunque sempre un piacere rivedere amici come Lorenzo e Dino, e mi è dispiaciuto non riuscire a conoscere personalmente Nino Crudele, ma sono sicuro che le occasioni non mancheranno Wink.

Chiudo con una riflessione: sarà un caso, ma ogni volta che io e Dino ci incontriamo, nevica !!! Bah ...

[OT] La neve ??? A Trani ??? :O

Non ho parole. Nella mia città si vede praticamente ogni 20 anni una nevicata così. Due immagini da casa mia. La prima scattata alle 2 di stanotte, la seconda stamattina al risveglio:

IMGP0843

IMGP0848

Ora vado in giro per la città a caccia di altre foto ... Big Smile

Technorati Tags:  

[WCF] Merge di file di configurazione

Qualche tempo fa avevo letto questo post di Pablo Cibraro (aka Cibrax) e mi ero ripromesso di fare la stessa cosa, ma lato server. In alcuni scenari può essere utile condividere la configurazione tra i differenti servizi. Recentemente ho invece letto quest'altro post in cui spiega la necessità di avere alcune impostazioni in un file di configurazione unico, condiviso tra i diversi servizi.

Oggi, complice una rara giornata fredda e nevosa, mi sono finalmente messo all'opera e questo è il risultato.

Ho ripreso parte del codice sviluppato da Cibrax ed incluso in uno specifico ServiceHost, chiamato UniqueConfigServiceHost. In pratica utilizzando questo ServiceHost si riesce a fare il merge delle impostazioni scritte in file di configurazione diversi da quello corrente. Magari non è il massimo e neppure così esauriente da risolvere tutte le problematiche, ma è una buona fonte di studio e una base di partenza per successive customizzazioni.

Partiamo dal principio...

La configurazione

Per utilizzare correttamente lo UniqueConfigServiceHost è necessario impostare nel proprio file di configurazione la sezione dotnetside.serviceLibrary(*):

<configSections>
<section name="dotnetside.serviceLibrary" type="DotNetSide.ServiceLibrary.Config.ServiceLibrarySection, DotNetSide.ServiceLibrary" />
</configSections>

Successivamente definiamo i files di configurazione che intendiamo utilizzare impostando i relativi percorsi:

 

<dotnetside.serviceLibrary>
<sharedConfigs>
<sharedConfig path="D:\Projects\DotNetSide.ServiceLibrary\commonBehaviors.config" />
<sharedConfig path="D:\Projects\DotNetSide.ServiceLibrary\commonBindings.config" />
</sharedConfigs>
</dotnetside.serviceLibrary>

Nel file commonBehavior.config abbiamo definito i behaviors comuni ai nostri servizi, mentre nel commonBindings.config abbiamo definito i bindings comuni. I servizi saranno definiti normalmente:

<system.serviceModel>
<services>
<service name="Service" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="wsHttpBinding" contract="IService" bindingConfiguration="sharedBinding">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>

Utilizziamo lo UniqueConfigServiceHost

L'utilizzo è abbastanza semplice. Se siamo in una applicazione di tipo self-host (che ospita un servizio WCF) semplicemente creiamo una istanza del service host:

using (UniqueConfigServiceHost host = new UniqueConfigServiceHost(typeof(Service1)))
{
host.Open();
// ...
host.Close();
}

Se invece utilizziamo IIS come host utilizziamo l'attributo Factory della direttiva @ServiceHost del nostro file .svc:

<%@ ServiceHost Language="C#" Debug="true" Service="Service" Factory="DotNetSide.ServiceLibrary.UniqueConfigServiceHostFactory" CodeBehind="~/App_Code/Service.cs" %>

Conclusioni

Il codice è ancora da migliorare. Sicuramente ci sono bug da risolvere soprattutto perchè non è mai stato testato in ambienti reali (ho finito di scriverlo qualche minuto fa ... Big Smile). Un problema "conosciuto" è quello che non è possibile creare un file di configurazione diverso da quello corrente con la definizione dei servizi e che punti a behaviors o bindings definiti esternamente. D'altronde avrebbe poco senso avere un file di configurazione di servizi "condiviso". E' però possibile definire un singolo file di configurazione "completo" ma diverso da quello corrente.

Provatelo e fatemi sapere... Smile

 

(*) se vi chiedete il perchè di questo nome, la risposta sta nel fatto che prevedo di aggiungere nuove funzioni e di ampliare la libreria

Technorati Tags:

Posted: Dec 15 2007, 03:56 PM by Fabio.Cozzolino | with 1 comment(s)
Filed under:
Riaperte le iscrizioni per il Workshop "Inside Sharepoint 2007"

Oggi abbiamo riaperto le iscrizioni per il prossimo workshop su Sharepoint 2007. Ebbene sì, ci siamo dovuti riorganizzare e per forza di cose, vedi feste natalizie e vari, l'appuntamento è slittato al nuovo anno. Segnatevi la data: 25/01/2008. Riapriamo le danze.

Le iscrizioni già pervenute sono ancora valide. Ogni iscritto ha già ricevuto o riceverà nelle prossime ore una mail con tutte le informazioni necessarie. I posti sono veramente limitati e vi consiglio di prenotare il più presto possibile Stick out tongue.

Vi preannuncio che il calendario di eventi 2008 si annuncia pieno zeppo di impegni. Per ora non posso parlarne ma durante l'Application Platform Roadshow faremo i dovuti annunci Big Smile. A proposito, ci si vede lì.

Nel frattempo ... ISCRIVETEVI !!!

Vito ne sarà contento ...

... dell'Architecture Journal Reader scritto in WPF Big Smile. Gabriele Castellani ne ha infatti annunciato la disponibilità da oggi sul blog di MSDN Italia.

Ottima iniziativa anche per vedere, se ancora ce ne fosse bisogno, WPF in azione... Smile

 

Ps.: E lo so che che c'era già il New York Times, ma l'Architecture Journal è l'Architecture Journal .... Stick out tongue

Pps.: Non funziona dietro un proxy ... Crying

Ppps.: Non è minimamente configurabile ... Crying

[WCF] ServiceCredentials.SetScopedCertificate

In scenari in cui è necessario stabilire un contesto di sicurezza basato sul riconoscimento del certificato X.509 del server, è possibile impostare il certificato utilizzando la proprietà ClientCredentials del proxy client:

MyServiceClient client = new MyServiceClient(); client.ClientCredentials.ClientCertificate.SetCertificate("CN=ClientCert", StoreLocation.LocalMachine, StoreName.My); client.ClientCredentials.ServiceCertificate.SetDefaultCertificate("CN=ServerCert", StoreLocation.LocalMachine, StoreName.My);

Fin qui tutto bene. Esiste anche la possibilità di definire un certificato diverso a seconda dell'indirizzo che deve essere invocato. La soluzione è molto interessante se utilizziamo lo stesso proxy per invocare diversi servizi, come ad esempio in scenari di federazione dove la richiesta di un token di autenticazione può essere inoltrata verso un apposito servizio (Security Token Service) che richiede l'utilizzo di un certificato diverso:

client.ClientCredentials.ServiceCertificate.SetScopedCertificate("CN=OtherCert", StoreLocation.LocalMachine, StoreName.My, new Uri("http://otherserver/MyOtherService"));

L'utilizzo del SetScopedCertificate consente proprio di definire un certificato da utilizzare per uno specifico indirizzo. Peccato che non funziona. O meglio non funziona uno dei due overload disponibili (fortunatamente). Spulciando con Reflector, infatti, mi sono accorto che la funzione semplicemente chiama l'altro overload ignorando i parametri StoreLocation e StoreName che gli vengono passati:

this.SetScopedCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectDistinguishedName, subjectName, targetService);

Mah... fortunatamente con l'altro overload tutto funziona correttamente, ma che svista !!! Stick out tongue

Posted: Dec 04 2007, 02:35 PM by Fabio.Cozzolino | with no comments
Filed under:
[OT] Noi ...

Andrea ha linkato questo video:

http://www.youtube.com/watch?v=BITzJGcFA_I

e quest'altro:

http://www.youtube.com/watch?v=-jHB1ZsM2-Q

Ragazzi, che spettacolo ... ho veramente le lacrimuccie agli occhi !!! GRANDISSSIMO !!!

Posted: Dec 01 2007, 01:27 PM by Fabio.Cozzolino | with no comments
Filed under: