Dec
11
WCF – VIII Parte
By Sergio79. Filed under .NET Framework, Articoli, C#, WCF
WCF e Windows Service
Un aspetto molto interessante di Windows Communication Foundation è la possibilità di ospitare un servizio WCF all’interno di un servizio di Windows.
Questa è decisamente una tecnica fortemente consigliata se il nostro servizio non necessita di un’interazione con alcuna UI e noteremo inoltre come tale soluzione non sia poi così differente rispetto a tutti i precedenti esempi mostrati sin’ora, dove tutti i servizi WCF creati erano ospitati in applicazioni windows e applicazioni web.
il Server
Avviamo VS scegliendo come tipo di progetto “Windows Service”.
Dal Solution Explorer posizioniamoci su Service1.cs e andiamo ad apportare le seguenti modifiche al codice auto generato:
using System.ServiceModel;
namespace WindowsService1
{
public partial class Service1 : ServiceBase, IServiceClass
{
ServiceHost sh = null;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
if (sh != null) sh.Close();
sh = new ServiceHost(typeof(Service1));
sh.Open();
}
protected override void OnStop()
{
if (sh != null)
{
sh.Close();
sh = null;
}
}
public string DoWork()
{
return DateTime.Now.ToString();
}
}
[ServiceContract]
public interface IServiceClass
{
[OperationContract]
string DoWork();
}
}
Non c’è molto da dire.
E’ stata semplicemente aggiunta l’interfaccia del nostro servizio WCF decorata dai soliti attributi, quindi la sua implementazione è stata riportata nella classe Service1 del servizio di windows, facendo ereditare quest’ultima da ServiceBase e appunto dall’interfaccia del servizio WCF, IServiceClass.
Il metodo DoWork è stato correttamente implementato e infine abbiamo gestito i metodi che verranno eseguiti all’avvio e alla chiusura del windows service.
Non ci resta che aggiungere e impostare correttamente il file di configurazione e per farlo, dal menu Project di VS scegliamo Add New Item, quindi Application Configuration File.
Minimizzando il più possibile, ecco le impostazioni di configurazione da inserire per il nostro servizio WCF:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service behaviorConfiguration="myBehave"> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:12345/tcp"/> </baseAddresses> </host> <endpoint address="" binding="netTcpBinding" contract="WindowsService1.IServiceClass"/> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/> </servce> </services> <behaviors> <serviceBehaviors> <behavior name="myBehave"> <serviceDebug includeExceptionDetailInFaults="false"/> <serviceMetadata httpGetEnabled="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Un’unica considerazione da fare è in merito a due nuovi elementi, host e baseAddress.
Specificando l’indirizzo in baseAddress evitiamo di scrivere l’intero percorso per sia per l’endpoint del servizio, che per il suo indrizzo mex.
L’ultimo step per la creazione del windows service consiste nella sua configurazione fattibile attraverso l’add installer messo a disposizione da VS, attraverso il quale possiamo imposare il nome del servizio, la sua descrizione, il tipo di account e il tipo di avvio.
Il servizio di windows è pronto, compiliamo il progetto e prepariamoci alla sua installazione tramite l’utility installUtil.
Avviamo dunque il command prompt di VS e digitiamo il seguente comando:
installUtil.exe servicePath\fileName.
Infine, andiamo nel servizio di Windows e avviamo il nostro servizio appena creato.
Nota: a procedura terminata, per disinstallare il servizio di esempio da noi creato basterà riavviare il command propomt di VS e digitare quanto segue:
installUtil.exe /u servicePath\fileName.
Il Client
Avviamo la seconda ed ultima istanza di VS e scegliamo come tipo di progetto una Windows Form Application.
Inseriamo il solito Button, quindi dal menu Project scegliamo Add Service Reference, digitando nella barra degli indirizzi il baseAddress impostato nel server: net.tcp://localhost:12345
Aggiunto il riferimento al servizio non ci resta che aprire una connessione e consumarlo con il metodo DoWork:
ServiceReference1.Service1 s =
new WindowsFormsApplication1.ServiceReference1.Service1();
this.Text = s.DoWork();
s.Close();
Questo codice è ormai familiare: è stata creata un’istanza di Service1, quindi è stato consumato il servizio WCF attraverso la chiamata al metodo DoWork.
Conclusioni
In pochi semplici passaggi è stato illustrato come ospitare un servizio WCF all’interno di un servizio di windows. La procedura dovrebbe risultare abbastanza chiara anche per coloro che non abbiano mai avuto necessità di sviluppare windows services, diversamente basterà fare qualche domanda sul forum di visualcsharp, o commentare questo stesso articolo.
If you enjoyed this post, then make sure you subscribe to our RSS Feed.
Comments
Leave a Reply

Feed degli articoli
Feed dei commenti
Forum














