Nella parte 1 della demo abbiamo visto come sia possibile ospitare un servizio Indigo all'interno di IIS. In questo terzo episodio voglio cambiare host del servizio, ed in particolare voglio che ad ospitare il servizio sia una componente COM+ (Enterprise Services). Essendo una tecnologia estremamente solida (c'è chi afferma che lo sia più di IIS) penso che possa essere decisamente affidabile per opsitare i servizi aziendali.

Iniziamo con il creare una windows library aggiungendo le referenze necessarie: System.EnterpriseServices.dll per COM+ e System.ServiceModel.dll per Indigo rispettivamente. Quindi decoriamo il nostro assembly con gli attributi necessari alla registrazione della componente:

[assembly: ApplicationName("PEWay Indigo Host")]
[assembly: ApplicationActivation(ActivationOption.Server)]

Nota: sarà necessario definire l'assembly strong named.

La nostra componente (che deriva da ServicedComponent) dovrà gestire due momenti importanti del ciclo di vita del servizio, ed in particolare lo startup e lo shutdown, quindi dovremo implementare l'interfaccia IProcessInitializer:

public class IndigoHost : ServicedComponent, IProcessInitializer
{
  public void Startup(object punkProcessControl)
  {
  }

  public void Shutdown()
  {
  }
}

A questo punto siamo pronti ad attivare l'host del servizio Indigo. Per fare questo dobbiamo definire tre aspetti (ricordate le caratteristiche dell'endpoint ?): address, binding e contratto.

Prendendo le stesse caratterstiche del servizio della demo 1 (cambia solo l'indirizzo) possiamo costruire da codice l'endpoint e quindi instanziare il sevice host:

BasicProfileBinding binding = new BasicProfileBinding();
Uri uri = new Uri("
http://localhost:7070/ContactService");

_host = new ServiceHost<ContactService>();
_host.AddEndpoint(typeof(IContactService), binding, uri);

A questo punto basta aprire la porta ricordandosi di chiuderla alla fine:

using System;
using System.EnterpriseServices;
using System.ServiceModel;

[assembly: ApplicationName("PEWay Indigo Host")]
[assembly: ApplicationActivation(ActivationOption.Server)]

namespace PEWay.Indigo.Sample
{
  public class IndigoHost : ServicedComponent, IProcessInitializer
  {
    private ServiceHost<ContactService> _host = null;

    public void Startup(object punkProcessControl)
    {
      try
      {
        BasicProfileBinding binding = new BasicProfileBinding();
        Uri uri = new Uri("
http://localhost:7070/ContactService");

        _host = new ServiceHost<ContactService>();
        _host.AddEndpoint(typeof(IContactService), binding, uri);
        _host.Open();

        System.Diagnostics.EventLog.WriteEntry("Application",
          "Indigo service listener started", System.Diagnostics.EventLogEntryType.Information);
      }
      catch (Exception ex)
      {
        System.Diagnostics.EventLog.WriteEntry("Application",
          ex.Message, System.Diagnostics.EventLogEntryType.Error);
      }
    }

    public void Shutdown()
    {
      if (_host != null)
      {
        _host.Close();
        _host.Dispose();
      }
    }
  }
}

A questo punto compiliamo e registriamo la componente (regsvcs.exe nomedll.dll) e la configuriamo come servizio NT:

Avviamo il servizio e da questo momento possiamo utilizzarlo come se fosse ospitato da IIS (vedi esempio di comando svcutil nella demo 2)