Por diversos motivos, parte de un sistema puede estar fuera de la aplicación web y correr en una publicación totalmente aparte como un servicio windows. Además, se puede usar los servicios windows para hostear servicios WCF, por lo cual publicar un servicio WCF significa en definitiva instalar un servicio windows con las caracteristicas necesarias para hostear el WCF.
Algunos servicios WCF (y por lo tanto servicios windows) actualmente productivos son:
Noanet.WebEdet
WebEdetTerminalService
Noanet.ProdTec
Edet.OmegaGold.MainService
También hay servicios windows actualmente productivos que no hostean WCF:
Noanet.Tarificador
Noanet.Cenit
Noanet.MasServicios
Los servicios publicados en QAS se encuentran en \\qa-web\c$\Services y los servicios publicados en producción se encuentran en el servidor WS-WEB (excepto el servicio Wea que está en un servidor dedicado).
En el resource WcfHosts and WindowsServices Installers se encuentra la explicación del código fuente de un proyecto instalador de un servicio windows.
Como sucede con la publicación de aplicaciones web, la publicación de un servicio debe hacerse de un branch versionado. Sin embargo, a diferencia de las aplicaciones web, no hay un comando de publicación para servicios WCF, sino que simplemente se compila el proyecto .Service.Server (compilar desde el branch versionado en configuración Release para Any CPU) y el resultado de la compilación en la carpeta bin\Release se utiliza como carpeta de publicación.
También al igual que sucede con publicación de aplicaciones web, en la carpeta de publicación del servidor donde se instalará el servicio se debe modificar los parámetros de configuración que sea necesario en el archivo .Service.Server.exe.config. Típicamente lo que se modificará será:
Cadenas de conexión a bases de datos
Sección log4net para logueo de errores (generalmente solo se habilita el RollingFileAppender)
Valores parametrizables en la sección appSettings
Configuración WCF en la sección serviceModel (tanto si el servicio hosteará WCF como si el servicio a su vez consume otros servicios)
Una vez alojada la carpeta de publicación en el servidor donde se instalará el servicio, se debe correr la utilidad installutil provista por el Fwk .NET. Paso a paso, las operaciones serían:
Abrir una ventana de consola DOS ejecutándola como administrador
Moverse a la carpeta de publicación en el server (comando cd)
Invocar la herramienta de instalación del Fwk .NET invocándola por el path completo (c:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe) indicándole primero los parámetros de instalación y al final el nombre del ejecutable (.Service.Server.exe)
Los parámetros que deben indicarse (siempre antes del nombre del archivo ejecutable) son:
ServiceName: Nombre con el que se creará el servicio windows y otros elementos asociados (como ser un origen de eventos para el visor de sucesos)
ServiceDisplayName: Nombre con el que se verá el servicio windows en la consola services.msc
ServiceDescription: Descripción adicional del servicio windows en la consola services.msc
Si no se especifican estos parámetros, el servicio se instalará con los parámetros por defecto que se hayan codificado en el proyecto ejecutable .Service.Server.exe. La sintaxis para indicar los parámetros es /paramName="paramValue" (el uso de las comillas es obligatorio).
Un ejemplo de un comando completo de instalación sería:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /servicename="Noanet.Test" /servicedisplayname="Noanet.Test" /servicedescription="Prueba de Instalación de Servicio" Noanet.Test.Service.Server.exe
Ocasionalmente, en el proceso de instalación se pedirá el ingreso de una identidad de usuario (si el instalador del servicio se configuró para correr con una cuenta de usuario a especificar). De lo contrario, el servicio se instalará y configurará para ejecutar con la cuenta de servicio local o alguna otra cuenta integrada de sistema que se haya configurado en el instalador del servicio. Igualmente, siempre se puede cambiar la identidad que corre el servicio windows desde la consola services.msc.
Si el servicio windows que se instala hostea servicios WCF, se debe especificar la dirección url en la que se escucharán las peticiones y eventualmente se debe habilitar los permisos para escuchar sobre tal url. Estos permisos se dan por puerto y por usuario, de modo que podría no ser necesario asignar los permisos al instalar un nuevo servicio WCF (si es que otro servicio ya corre con el mismo usuario y sobre el mismo puerto).
Cada servicio debe tener una URL base única, pero aun así pueden múltiples servicios pueden compartir puertos. Actualmente, para simplificar la administración del Firewall, todos los servicios WCF tienen url sobre el puerto 8888 (excepto los servicios vinculados a WebEDET). Si el servicio que se hosteará utilizará otro puerto distinto al 8888, se debe crear una regla de entrada en el Firewall para habilitar las peticiones entrantes.
La dirección url base donde se hosteará el servicio WCF está indicada en la sección serviceModel del archivo .Service.Server.exe.config. Una estructura típica es:
<system.serviceModel>
<services>
<service name="Noanet.PowerAccess.Service.PowerAccessService">
<host>
<baseAddresses>
<add baseAddress="http://qa-web:8888/Noanet.PowerAccess.Service/PrincipalService"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="Noanet.PowerAccess.Service.IPowerAccessService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Generalmente, lo único que hace falta configurar del hosteo del servicio en una publicación es el atributo baseAddress del elemento host resaltado en la configuración anterior.
En caso de que sea necesario asignar permisos para que el servicio pueda escuchar peticiones sobre el puerto configurado en la url, se debe ejecutar en el servidor donde se publica el servicio WCF el siguiente comando en consola DOS (como administrador):
netsh http add urlacl url=http://+:numeropuerto/ user=username
Realizados todos estos pasos, el servicio Windows debería correr normalmente y estar hosteando servicios WCF si el servicio cumpliera este propósito.
Para verificar que un servicio WCF esté correctamente hosteado, se debe intentar agregar una referencia al mismo desde cualquier proyecto VS. Si el asistente para agregar una referencia a servicio del IDE de VS logra contactar al servicio WCF, es porque el mismo podrá ser contactado por cualquier cliente.
En cualquier proyecto .NET, se puede agregar una referencia a un servicio WCF. Basta con hacer click derecho en la carpeta References del proyecto y en el menú contextual elegir la opción Add service reference, lo que abre el cuadro de diálogo para referenciar un servicio:
Tipeando la url base del servicio WCF y presionando el botón Go, el asistente de VS intentará descubir las operaciones expuestas por el servicio. Con solo lograr ver la lista de operaciones queda asegurada el correcto hosteo del servicio WCF (no hace falta agregar la referencia en sí).
Las consideraciones para publicar un servicio WCF host en producción son básicamente las mismas que para publicar una aplicación web en producción. El principio general es que se envía a Infraestructura TI un instructivo con las operaciones paso a paso necesarias para instalar y dejar funcionando el servicio en producción.
Típicamente, los puntos a tener en cuenta son:
Crear una carpeta especial dentro \\qa-web\c$\Temp con lo que será la carpeta de publicación a copiar hacia el entorno productivo.
Dejar en esta carpeta especial todas las configuraciones específicas del entorno productivo que sean posibles (como sere la url base del servicio WCF o las conexiones a base de datos reales con excepción de las contraseñas para informix)
En la carpeta de publicación, incluir un archivo bat con el comando de instalación (donde ya estén seteados el nombre de servicio y demás parámetros de instalación) y otro archivo bat con la instrucción necesaria para asignar permisos sobre el puerto si fuera necesario.