BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

[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:

Comments

Pablo M. Cibraro (aka Cibrax) said:

One of the blog's readers from Italy, Fabio Cozzolino has written a interesting host for WCF that gets

# December 24, 2007 2:31 PM