Hospedaje de Un Servicio WCF en Un Servicio Administrado de Windows (Windows Service)

Hospedaje de un servicio WCF en un Servicio Administrado de Windows (Windows Service) Como alternativa al uso de los ser

Views 99 Downloads 0 File size 358KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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 tecnología WCF puede ser publicada desde un Windows Service lo que permite una mejora en el rendimiento y un mayor grado de personalización sacrificando las propiedades de configuración y gestión proporcionadas por los servidores antes mencionados.

En un escenario que requiera un rendimiento mayor se recomienda el uso de este tipo de conexión ya que al no hacer uso del servidor IIS nos ahorramos el peso de todas las características y procesos adicionales que el servidor ejecuta.

Sistemas Operativos Soportados Windows XP SP3, Windows 7 en todas sus ediciones, Windows 8 y más

Versiones de .Net Framework Soportados 3.5, 4, 4.5 y superiores

Ejemplo de Implementación (Desde Microsoft MSDN) Este tema describe los pasos básicos necesarios para crear un servicio de Windows Communication Foundation (WCF) hospedado por un servicio de Windows. El escenario está habilitado por la opción de hospedaje de servicio de Windows administrado que es un servicio de WCF de ejecución 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 duración del servicio. Esta opción 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 automáticamente para iniciar cuando el sistema arranca. Esta opción de hospedaje consiste en el registro del dominio de la aplicación (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 código del servicio incluye una implementación del contrato de servicios, una clase de Windows Service y una clase del instalador. La clase de implementación 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 métodos 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 también es responsable de proporcionar una dirección base al host de servicio, que se ha configurado en los valores de la aplicación. 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 código del hospedaje 1.

Cree un nuevo proyecto de aplicación 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 código 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 código 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 método 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 método OnStart(String) creando y abriendo una nueva instancia de ServiceHost, tal como se muestra en el código 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 método OnStop cerrando ServiceHost, tal como se muestra en el código 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 configuración de aplicación al proyecto. Reemplace el contenido del archivo por el XML de configuración siguiente.















Haga clic con el botón 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 explícitamente en el archivo de configuración. Si no agrega ningún extremo al servicio, el tiempo de ejecución agregará los extremos predeterminados. En este ejemplo, dado que el servicio tiene un ServiceMetadataBehavior establecido en , el servicio también tiene habilitada la publicación de metadatos. Para obtener más información sobre los extremos, enlaces y comportamientos predeterminados, vea Configuración simplificada y Configuración simplificada de los servicios de WCF.

Instale y ejecute el servicio. 1.

Compile la solución para crear el ejecutable Service.exe.

2.

Abra el símbolo del sistema de Visual Studio 2012 y navegue hasta el directorio del proyecto. Escriba installutil bin\service.exe en el símbolo del sistema para instalar el servicio de Windows. Nota Si no usa el símbolo del sistema de Visual Studio 2012, asegúrese de que el directorio %WinDir%\Microsoft.NET\Framework\v4.0. se encuentra en la ruta de acceso del sistema.

3.

Escriba services.msc en el símbolo del sistema para tener acceso al Administrador de control de servicios (SCM). El servicio de Windows debería 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 botón secundario en el SCM y seleccione "Iniciar" o escriba net start WCFWindowsServiceSample en el símbolo del sistema.

4.

Si realiza cambios en el servicio, debe detenerlo primero y desinstalarlo. Para detener el servicio, haga clic con el botón secundario en el SCM y seleccione "Stop" o escriba type net stop WCFWindowsServiceSample en el símbolo del sistema. Tenga en cuenta que si detiene el servicio de Windows y, a continuación, ejecuta un cliente, se produce una excepción 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 símbolo del sistema.

Ejemplo: A continuación, se muestra el listado completo del código 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 opción de "autohospedaje", el entorno de hospedaje del servicio de Windows requiere que algún código de hospedaje se escriba como parte de la aplicación. El servicio se implementa como una aplicación de consola y contiene su propio código de hospedaje. En otros entornos de hospedaje, como el del Servicio de activación de procesos de Windows (WAS) en Internet Information Services (IIS), no es necesario que los programadores escriban código de hospedaje.