C# WinServiceBasic1 v1.1.0: Servicio con servidor HTTP

El servicio que he programado hasta ahora no ofrece ninguna funcionalidad, uno de los usos más habituales es ofrecer un puerto abierto a la escucha para comunicarse con otras aplicaciones en red que ejercen de clientes. En vez de inventar un nuevo protocolo vamos a usar uno reconocido, usando la clase HttpListener vamos a crear un servidor HTTP muy sencillo (espacio de nombres “using System.Net”);

Proyecto en GitHub (v1.1.0)

Clase WebServer

Vamos a crear una clase WebServer que agrupa todas las funcionalidades de nuestro servidor Web. Solo contiene dos atributos privados:

  • _listener: Una instancia de la clase HttpListener.
  • _responderMethod: El capturador de evento cuando un cliente se conecta.

Los métodos que ofrece son tres:

  • WebServer: El constructor de la clase, recibe la URL donde se pondrá a la escucha (por ejemplo “http://localhost:8080/test/” y la función externa a la clase que genera la respuesta al cliente (_responderMethod).  La parte más interesante del constructor es la llamada a _listener.Start().
  • Run: Este método no acepta parámetros. Emplea el método IsListening de HttpListener para determinar si se ha iniciado. La clase  HttpListenerContext proporciona acceso a los objetos de solicitud y respuesta utilizados por la clase HttpListener.  Llama al método interno que apunta a la función que captura la solicitud cliente “_responderMethod(ctx.Request);” y con la respuesta la redirecciona al cliente HTTP.
  • Stop: Este método es muy simple, llama a la Stop y Close de HttpListener.

Ejecución

Ejecutamos e introducimos la siguiente URL en nuestro navegador para ver el resultado: http://localhost:8080/test/.

Posts relacionados

Referencias Externas

 

 

C# WinServiceBasic1 v1.0.1: Añadimos algunas mejoras al servicio

Después de experimentar un poco con el servicio (C# WinServiceBasic1: Crear un servicio básico en Windows) he prescindido del control de VS que permite instalar el servicio y hacerlo yo mismo a mano con scripts PS (PowerShell), los he guardado en la carpeta Debug y permiten instalar / desinstalar / arrancar / parar / ver estado del servicio.

Proyecto WinServiceBasic1 en GitHub.

WinServiceBasic1_install.ps1

Utilizo el comando New-Service para instalar el servicio, el script previamente copia el ejecutable en C:\bin y borra el servicio si ya existiese previamente.

WinServiceBasic1_delete.ps1

WinServiceBasic1_start.ps1

Start-Service -Name "MyNewService"

WinServiceBasic1_stop.ps1

Stop-Service -Name "MyNewService"

WinServiceBasic1_view.ps1

Get-WmiObject win32_service -Filter "name='MyNewService'"

También he realizado modificaciones en las propiedades del objeto eventLog1 (clase EventLog para escribir logs que se visualizan en el visor de eventos de Windows), es necesario especificar la propiedad Source, normalmente se define como el nombre de la aplicación (“MyNewService” en este caso).

Ajusto algunos parámetros del objeto “MyNewService” (heredado de la clase ServiceBase) para modificar el comportamiento del servicio. La propiedad AutoLog a “False” para que la aplicación no genere eventos por su cuenta.

Además he sobrecargado el método WriteEntry para ilustrar como generar diferentes tipos de eventos (información, error,…):

Ahora los eventos del visor de eventos de Windows proporcionan más información:

Después de probar un rato con EventLog he instalado NLog para generar logs con más flexibilidad (ver “NLog: Sistema de logging gratuito y de código abierto para .Net“)

Referencias externas

 

C# WinServiceBasic1: Crear un servicio básico en Windows

Los servicios (o demonio en Linux) son normalmente aplicaciones que corren de fondo (sin interfaz) y ofrecen como su nombre lo dice un servicio a otras aplicaciones, es muy común por ejemplo para implementar  protocolos de comunicaciones en red con otras máquinas mediante sockets TCP/UDP actuando como un servidor.  Otro uso muy común es como servidor de acceso a datos alojados en una máquina central.

Código del ejercicio en GitHub

Crear un servicio en VS 2012

En Visual Studio ahora te facilita crear aplicaciones de este tipo ya que ofrece un tipo de proyecto especifico “Windows Service”:

Visual Studio añade automáticamente una clase nueva Service1.cs heredada de System.ServiceProcess.ServiceBase.

Cambiamos el nombre de “Service1” por “MyNewService” buscando y reemplazando en todo el proyecto,

Añadir eventos de Windows

En la vista de diseño de Service1.cs arrastramos y añadimos un control “EventLog

VS le asigna un nombre eventLog1 a la nueva clase, podemos cambiar el nombre de la clase en las propiedades.

Ahora ya podemos añadir eventos para notificar de arranque / parada del servicio.

Instalar el servicio

Para crear un instalador usamos el botón derecho del ratón en la vista diseño Service1.cs sobre el fondo y el menú contextual seleccionamos “Add Installer”, revisamos las propiedades de “serviceInstaller1”, ServiceName debe estar definido como “MyNewService”, es importante elegir el tipo de arranque (lo dejamos en manual por el momento).

Para instalar el servicio hay que hacerlo mediante el interprete de comandos “Developer Command Prompt” incluido en VS.

Ahora vamos a la carpeta de salida donde está WinServiceBasic1.exe y ejecutamos:

installutil.exe WinServiceBasic1.exe

 

Composer: Gestor de dependencias para PHP, instalando Laravel…

Composer-A-Dependency-Manager-for-PHP-1030x360

Composer es un gestor de dependencias para PHP, a mi me recuerda a Yum para distribuciones Linux basadas en gestor de paquetes RPM como Fedora o RedHat o  también Synaptic para Ubuntu.  ¿Decir eso no es gran cosa verdad? Cuando descargamos un proyecto normalmente este tiene necesidades de librerías de otros desarrollos o proyectos alojados y mantenidos por otros (y a su vez estos con otros de terceros). Composer resuelve esta red de necesidades.

A pesar de que no soy precisamente un fan de Windows se puede bajar la versión para línea de comando siguiendo este enlace  https://getcomposer.org/download/. Descargamos y ejcutamos Composer-Setup.exe.

composer

Se escribimos composer en la línea de comando nos muestra todas las opciones disponibles.

A modo de ejemplo vamos a crear un proyecto basado en Laravel (framework PHP), escribimos lo siguiente en nuestro servidor Web:

composer createproject laravel/laravel Laravel

Inmediatamente comenzará a descargar todos los paquetes y librerías necesarias en la carpeta Laravel, ya tenemos instalado el framework!

Probamos con: http://localhost/Laravel/server.php y muestra un texto que reza “Laravel 5”.

Ahora editamos el archivo app\Http\routes.php y añadimos la siguiente línea para crear un nuevo recurso:

Route::resource(‘user’, ‘UserController’);

Usando la línea de comando dentro de la carpeta Laravel ejecutamos el siguiente comando para crear un controlador llamado UserController:

php artisan make:controller UserController

En la carpeta Laravel\app\Http\Controllers ahora tenemos archivos nuevos:

  • Controller.php
  • UserController.php

Que contienen el esqueleto de nuestras funciones ya creado.

Ahora si volvemos a la línea de comando y ejecutamos:

php artisan route:list

Vemos que ya tenemos una serie de llamadas para nuestro controlador:

composer1