You are on page 1of 9

Hospedaje de un servicio WCF en un Servicio Administrado

de Windows (Windows Service)


Como alternativa al uso de los servidores HTTP Microsoft IIS y UltiDev la tecnologa WCF puede ser
publicada desde un Windows Service lo que permite una mejora en el rendimiento y un mayor grado de
personalizacin sacrificando las propiedades de configuracin y gestin proporcionadas por los servidores
antes mencionados.

En un escenario que requiera un rendimiento mayor se recomienda el uso de este tipo de conexin ya que al
no hacer uso del servidor IIS nos ahorramos el peso de todas las caractersticas y procesos adicionales que el
servidor ejecuta.

Sistemas Operativos Soportados


Windows XP SP3, Windows 7 en todas sus ediciones, Windows 8 y ms

Versiones de .Net Framework Soportados


3.5, 4, 4.5 y superiores

Ejemplo de Implementacin (Desde Microsoft MSDN)


Este tema describe los pasos bsicos necesarios para crear un servicio de Windows Communication
Foundation (WCF) hospedado por un servicio de Windows. El escenario est habilitado por la opcin de
hospedaje de servicio de Windows administrado que es un servicio de WCF de ejecucin prolongada
hospedado fuera de Internet Information Services (IIS) en un entorno seguro que no es activado por
mensaje. En su lugar, el sistema operativo controla la duracin del servicio. Esta opcin de hospedaje est
disponible en todas las versiones de Windows.
Los servicios de Windows se pueden administrar con Microsoft.ManagementConsole.SnapIn en Microsoft
Management Console (MMC) y pueden configurarse automticamente para iniciar cuando el sistema
arranca. Esta opcin de hospedaje consiste en el registro del dominio de la aplicacin (AppDomain) que
hospeda un servicio de WCF como un servicio administrado por Windows, de modo que la vida del proceso
est controlada por el Administrador de control de servicios (SCM) de los servicios de Windows.
El cdigo del servicio incluye una implementacin del contrato de servicios, una clase de Windows Service y
una clase del instalador. La clase de implementacin de servicio, CalculatorService, es un servicio WCF.
CalculatorWindowsService es un servicio de Windows. Para poder calificarse como servicio de Windows, la

clase hereda de ServiceBase e implementa los mtodos OnStart y OnStop. En OnStart, se


creaServiceHost para el tipo CalculatorService y se abre. En OnStop, el servicio se detiene y se elimina. El
host tambin es responsable de proporcionar una direccin base al host de servicio, que se ha configurado
en los valores de la aplicacin. La clase del instalador, que hereda de Installer, permite instalar el programa
como un servicio de Windows mediante la herramienta Installutil.exe.

Construya el servicio y proporcione el cdigo del hospedaje


1.

Cree un nuevo proyecto de aplicacin de Visual Studio Console Application denominado "Service".

2.

Cambie el nombre del archivo Program.cs a Service.cs.

3.

Cambie el espacio de nombres a Microsoft.ServiceModel.Samples.

4.

Agregue referencias a los ensamblados siguientes.

5.

System.ServiceModel.dll

System.ServiceProcess.dll

System.Configuration.Install.dll

Agregue las siguientes instrucciones Using a Service.cs.


using System.ComponentModel;
using System.ServiceModel;
using System.ServiceProcess;
using System.Configuration;
using System.Configuration.Install;

6.

Defina el contrato de servicio ICalculator, tal y como se muestra en el cdigo siguiente.


// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}

7.

Implemente el contrato de servicio en una clase denominada CalculatorService, tal como se muestra en el
cdigo siguiente.

// Implement the ICalculator service contract in a service class.


public class CalculatorService : ICalculator
{
// Implement the ICalculator methods.
public double Add(double n1, double n2)
{
double result = n1 + n2;
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
return result;
}
}

8.

Cree una nueva clase denominada CalculatorWindowsService que herede de la clase ServiceBase.
Agregue una variable local denominada serviceHost para hacer referencia a la instancia de ServiceHost.
Defina el mtodo que llama a ServiceBase.Run(new CalculatorWindowsService).

public class CalculatorWindowsService : ServiceBase

{
public ServiceHost serviceHost = ;
public CalculatorWindowsService()
{
// Name the Windows Service
ServiceName = "WCFWindowsServiceSample";
}
public static

Main()

{
ServiceBase.Run( CalculatorWindowsService());
}

9.

Invalide el mtodo OnStart(String) creando y abriendo una nueva instancia de ServiceHost, tal como se
muestra en el cdigo siguiente.
// Start the Windows service.
protected override

OnStart(string[] args)

{
(serviceHost != )
{
serviceHost.Close();
}
// Create a ServiceHost for the CalculatorService type and
// provide the base address.
serviceHost =

ServiceHost(typeof(CalculatorService));

// Open the ServiceHostBase to create listeners and start


// listening for messages.
serviceHost.Open();
}

10. Invalide el mtodo OnStop cerrando ServiceHost, tal como se muestra en el cdigo siguiente.
protected override

OnStop()

{
(serviceHost != )
{
serviceHost.Close();
serviceHost = ;

}
}

11. Cree una nueva clase denominada ProjectInstaller que herede de Installer y que est marcada con
el RunInstallerAttribute establecido en . Esto permite a la herramienta Installutil.exe instalar el servicio de
Windows.
// Provide the ProjectInstaller class which allows
// the service to be installed by the Installutil.exe tool
[RunInstaller()]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller()
{
process =

ServiceProcessInstaller();

process.Account = ServiceAccount.LocalSystem;
service =

ServiceInstaller();

service.ServiceName = "WCFWindowsServiceSample";
Installers.Add(process);
Installers.Add(service);
}
}

12. Quite la clase Service generada al crear el proyecto.


13. Agregue un archivo de configuracin de aplicacin al proyecto. Reemplace el contenido del archivo por el
XML de configuracin siguiente.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<!-- This section is optional with the new configuration model
introduced in .NET Framework 4. -->
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>

<add
baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
</baseAddresses>
</host>
<!-- this endpoint is exposed at the base address provided by
host: http://localhost:8000/ServiceModelSamples/service

-->

<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator"
/>
<!-- the mex endpoint is exposed at
http://localhost:8000/ServiceModelSamples/service/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Haga clic con el botn secundario en el archivo App.config en el Explorador de soluciones y seleccione
Propiedades. Debajo de Copiar en el directorio de resultados, seleccione Copiar si es posterior.
Este ejemplo especifica extremos explcitamente en el archivo de configuracin. Si no agrega ningn
extremo al servicio, el tiempo de ejecucin agregar los extremos predeterminados. En este ejemplo,
dado que el servicio tiene un ServiceMetadataBehavior establecido en , el servicio tambin tiene
habilitada la publicacin de metadatos. Para obtener ms informacin sobre los extremos, enlaces y
comportamientos predeterminados, vea Configuracin simplificada y Configuracin simplificada de los
servicios de WCF.

Instale y ejecute el servicio.


1.

Compile la solucin para crear el ejecutable Service.exe.

2.

Abra el smbolo del sistema de Visual Studio 2012 y navegue hasta el directorio del proyecto. Escriba
installutil bin\service.exe en el smbolo del sistema para instalar el servicio de Windows.
Nota
Si no usa el smbolo del sistema de Visual Studio 2012, asegrese de que el directorio
%WinDir%\Microsoft.NET\Framework\v4.0.<current version> se encuentra en la ruta de acceso del
sistema.

3.

Escriba services.msc en el smbolo del sistema para tener acceso al Administrador de control de servicios
(SCM). El servicio de Windows debera aparecer en Servicios como "WCFWindowsServiceSample". El
servicio WCF solo puede responder a los clientes si el servicio de Windows se est ejecutando. Para
iniciar el servicio, haga clic con el botn secundario en el SCM y seleccione "Iniciar" o escriba net start
WCFWindowsServiceSample en el smbolo del sistema.

4.

Si realiza cambios en el servicio, debe detenerlo primero y desinstalarlo. Para detener el servicio, haga
clic con el botn secundario en el SCM y seleccione "Stop" o escriba type net stop
WCFWindowsServiceSample en el smbolo del sistema. Tenga en cuenta que si detiene el servicio de
Windows y, a continuacin, ejecuta un cliente, se produce una
excepcin EndpointNotFoundException cuando un cliente intenta tener acceso al servicio. Para
desinstalar el tipo de servicio de Windows, escriba installutil /u bin\service.exe en el smbolo del
sistema.

Ejemplo:
A continuacin, se muestra el listado completo del cdigo que se emplea en este tema.
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;

using
using
using
using
using

System.ComponentModel;
System.ServiceModel;
System.ServiceProcess;
System.Configuration;
System.Configuration.Install;

namespace Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]

double Multiply(double n1, double n2);


[OperationContract]
double Divide(double n1, double n2);
}
// Implement the ICalculator service contract in a service class.
public class CalculatorService : ICalculator
{
// Implement the ICalculator methods.
public double Add(double n1, double n2)
{
double result = n1 + n2;
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
return result;
}
}
public class CalculatorWindowsService : ServiceBase
{
public ServiceHost serviceHost = ;
public CalculatorWindowsService()
{
// Name the Windows Service
ServiceName = "WCFWindowsServiceSample";
}
public static Main()
{
ServiceBase.Run( CalculatorWindowsService());
}
// Start the Windows service.
protected override OnStart(string[] args)
{
(serviceHost != )
{
serviceHost.Close();
}
// Create a ServiceHost for the CalculatorService type and
// provide the base address.
serviceHost = ServiceHost(typeof(CalculatorService));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
serviceHost.Open();

}
protected override OnStop()
{
(serviceHost != )
{
serviceHost.Close();
serviceHost = ;
}
}
}
// Provide the ProjectInstaller class which allows
// the service to be installed by the Installutil.exe tool
[RunInstaller()]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller()
{
process = ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = ServiceInstaller();
service.ServiceName = "WCFWindowsServiceSample";
Installers.Add(process);
Installers.Add(service);
}
}
}

Como la opcin de "autohospedaje", el entorno de hospedaje del servicio de Windows requiere que algn
cdigo de hospedaje se escriba como parte de la aplicacin. El servicio se implementa como una aplicacin
de consola y contiene su propio cdigo de hospedaje. En otros entornos de hospedaje, como el del Servicio
de activacin de procesos de Windows (WAS) en Internet Information Services (IIS), no es necesario que los
programadores escriban cdigo de hospedaje.

You might also like