Servizio WCF ospitato nei Windows Services

Mi sono sempre chiesto la differenza tra ospitare un servizio WCF in IIS e nei Windows Services (services.msc, per capirsi). Così mi sono documentato e ho trovato quanto segue nell’MSDN.

image

Non contento ho fatto una prova completa dalla creazione del progetto all’installazione e interrogazione del servizio per capirci di più. Metto a disposizione il download della soluzione di Visual Studio 2015 che implementa questo esperimento.

Questi sono stati i passaggi.

  1. Nuovo progetto di tipo WCF Service Library
    1
  2. Ho rinominato con F2 i nomi dei file del progetto standard e del servizio che volevo implementare. Ho chiamato l’interfaccia ICalculatorService e la classe che lo implementa CalculatorService. Il servizio espone una funzionalità di somma di numeri con virgola.2
  3. Implementazione molto semplice nella classe CalculatorService.
    3
  4. Ho eseguito il progetto (F5) e mi sono imbattuto subito in un problema: AddressAccessDeniedException. Cercando su MSDN e StackOverflow ho capito che è un problema di privilegi. Per registrare un endpoint di ascolto bisogna avere permessi di amministratore.
    4
  5. Riavviato Visual Studio come amministratore e rieseguito il processo tutto parte senza problemi nell’host dei servizi.5
  6. E con il WCF test client le somme funzionano.6
  7. Viene il momento di creare un nuovo progetto per creare un Servizio Windows che ospiti il servizio WCF. Aggiungo quindi il progetto alla soluzione.7
  8. Un po’ di rinomina sui nomi del file e del servizio che chiamo WindowsCalculatorService rendono più chiaro il lavoro.8
  9. Aggiungo al progetto un installer per facilitare il lavoro di installazione del servizio. Clic destro, Add Installer.9
  10. Il bravo Visual Studio inserisce l’installer correttamente e vado a valorizzare con dei nomi sensati alcune proprietà tipo il nome del servizio con cui poi lo stesso comparirà nell’elenco dei servizi di Windows. C’è anche la possibilità di dare una descrizione (che io ho omesso).10
  11. Sostituisco il metodo Main() di Program.cs del progetto WindowsCalculatorService con queste righe di codice per permettere l’installazione semplicemente avviando l’exe e digitando una lettera: I installa, U disinstalla. 11
  12. Per fare funzionare questo trucchetto bisogna convertire il progetto in progetto Console andando nelle Proprietà del progetto stesso. 12
  13. Per far sì che il servizio WCF sia correttamente configurato quando ospitato dal servizio Windows bisogna riportare la configurazione dal file App.config del progetto WCF a quello del servizio di Windows. Attenzione! Riportare solo la sezione <system.serviceModel>! 13
  14. Per permettere l’installazione del servizio di Windows è necessario avere privilegi di amministratore quindi aggiungendo un file manifest alla soluzione WindowsCalculatorService (add item –> manifest file) vado a specificare level=requireAdministrator nell’apposita sezione <security> del file.14
  15. Modifico il WindowsCalculatorService.cs affinché quando viene avviato esegua il necessario per ospitare il nostro servizio WCF CalculatorService.
    21
  16. Compilo e avvio WindowsCalculatorService.exe e il sistema operativo propone l’UAC come giusto che sia.
    15
  17. Ottenuta la conferma il programma Console ci chiede se vogliamo installare o disinstallare. Ovviamente scrivo I ed installo.16
  18. L’installer del servizio vuole sapere con che utenza deve girare il nostro servizio. Inserisco le mie credenziali.
    17
  19. Ecco che il servizio compare correttamente nell’elenco dei servizi di Windows e lo avvio.18
  20. Avviando il WCF Test Client inserisco l’endpoint specificato nel file app.config.19
  21. Il servizio è operativo e funzionante!20

Voi avete esperienza con WCF? Io l’ho sempre usato per piccole cose e sempre in IIS ma dopo questa prova con i servizi di Windows credo che li userò sempre così. Sono più adatti ai miei scopi e, soprattutto, non richiede l’installazione di IIS.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s