viernes, 15 de febrero de 2013

WCF - Cómo añadir metadatos a una instancia de ServiceHost

En el artículo de hoy veremos como publicar metadatos asociados a una instancia de la clase

ServiceHost

. A la hora de hospedar un servicio

WCF

tenemos varias alternativas como IIS, servicios de windows, Windows Activation Services o directamente creando nuestra propia aplicación windows o consola y controlada cada instancia de servicio por código.

A priori, hay veces que el escenario marca un poco el sistema que escogeremos. Por ejemplo si van a conectar clientes que no sean

WCF

es casi obligado hospedar los servicios en un IIS. En caso que sepamos con toda seguridad que los clientes serán WCF recomendaría crearnos una aplicación y controlar nosotros mismos la instancia de la clase

ServiceHost

de cada servicio. ¿Qué ventajas hay respecto a hospedar en un IIS?

  • Podemos configurar un binding NetTcpBinding que será más rápido que un binding por protocolo http.
  • Es más sencillo controlar temas avanzados del Hosting respecto al resto de alternativas
  • Requiere menos infraestructura

Levantar una instancia de servicio y hospedarla en una aplicación de tipo consola o windows es relativamente sencillo, hemos de crearnos un binding del tipo que consideremos, la dirección y poco más... La cosa se complica un poco si queremos publicar metadatos asociados al servicio, veamos como hacerlo:
  //address - Uri
  Uri Uri = new System.Uri("net.tcp://localhost/Services/");
  ServiceHost svc = new ServiceHost(typeof(ServiceAreaTicSample), Uri);

  #region netTcpBinding
  NetTcpBinding bindingDefault = new NetTcpBinding(SecurityMode.None);
  svc.AddServiceEndpoint("AreaTIC.WCFServer.IServiceAreaTicSample",bindingDefault, "AreaTicSample");
  #endregion
            
  #region Metadatos
  ServiceMetadataBehavior smb = svc.Description.Behaviors.Find<ServiceMetadataBehavior>();
  if (smb == null)
     smb = new ServiceMetadataBehavior();
            
  svc.Description.Behaviors.Add(smb);
  // Add MEX endpoint
  svc.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexTcpBinding(),"mex");
  svc.Open();
  #endregion
Con esto ya tendríamos un servicio con metadatos publicados lo cual implica que podríamos crear un cliente fácilmente a partir de la URL en la que hemos publicado los metadatos.

WCF - Cómo añadir metadatos a una instancia de ServiceHost

Los metadatos en este caso no serían equivalentes a un documento Wsdl, aunque sin cambiar demasiado código podríamos definir un binding por protocolo http y configurar

ServiceMetadataBehavior

para que publique un documento Wsdl en la misma Url que hemos hospedado el servicio. Hasta aquí el artículo de hoy. Recordar que podéis seguir

areaTIC

en las redes sociales y/o rss y no os cortéis a la hora de participar!


No hay comentarios:

Publicar un comentario en la entrada