Servicios WCF hospedados en IIS (I)

Hola a todos, mi nombre es Cristina y, a pesar de llevar ya un tiempo en Plain Concepts, hasta ahora no me había animado a postear. Espero que esto cambie a partir de ahora y me veáis cada vez con más frecuencia por aquí :). Mi intención es hablaros de lenguajes de programación, diseño, arquitectura de aplicaciones, WPF, entity framework,… vamos, un poco de todo.

Para ir calentando motores, en este primer post os voy a explicar cómo hospedar un servicio WCF en IIS. Veremos cómo crear y configurar un servicio WCF, cómo hospedarlo en IIS y, en un próximo post, crearemos y configuraremos un cliente que se comunique con nuestro servicio. Ahora… vamos al grano!

Creación de una librería WCF

Para nuestro proyectito de prueba vamos a empezar creando una librería WCF, que contendrá la implementación de los servicios que queremos exponer. Para ello creamos un proyecto nuevo de Visual Studio de tipo WCF Service Library. La plantilla de Visual Studio nos creará un esquema que contiene un ejemplo que nos guiará en la creación de nuestro servicio. Dicha plantilla incluye, por una parte, el fichero IService1.cs, el cual representa el contrato del servicio WFC y contiene una interfaz que se decora con [ServiceContract] y las operaciones a exponer que se decoran con el atributo [OperationContract].

02-IService - Copy

En dicha plantilla también se incluye cómo se deberían tratar los tipos complejos para que se serialicen correctamente a través del servicio. Lo que hay que hacer es decorar la clase con el atributo [DataContract] y los métodos con [DataMember].

Por otra parte, el esquema que genera Visual Studio  también contiene el fichero Service1.cs que implementa la interfaz IService1.cs. Por tanto, es el que va a tener la lógica de nuestro servicio.

Una vez hecho esto, pasaremos a crear una aplicación WCF que utilice nuestra librería y lo configuraremos para hostearlo en IIS.

Creación de una aplicación WCF06-SolutionExplorer

Añadimos a nuestra solución un nuevo proyecto de tipo WCF Service Application. Como podemos ver en la imagen,  la plantilla de Visual Studio también nos crea el contrato para el servicio en el fichero IService1.cs. Sin embargo, no lo vamos a necesitar puesto que vamos a utilizar el que hemos creado en la librería anterior. Del mismo modo, si desplegamos el elemento asociado a Service1.svc y lo abrimos, podremos comprobar que contiene la implementación asociada al contrato de IService1.cs. Nuevamente, lo que vamos a utilizar es el código del proyecto anterior. Por tanto, eliminamos del proyecto tanto el fichero IService1.cs como el fichero Service1.svc.cs, pero ojo! no Service1.svc.

Dado que nos hemos cargado alegremente las operaciones del servicio predefinidas en el proyecto que contiene la aplicación WCF, lo siguiente que tenemos que hacer es vincular a dicho proyecto la librería con la implementación de los servicios WCF que realmente vamos a utilizar, de modo que añadimos al proyecto la referencia de la librería. A continuación hacemos doble clic sobre Service1.svc.cs y obtenemos la siguiente configuración:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceApplication.Service1" CodeBehind="Service1.svc.cs" %>

Deberemos modificarlo indicando la localización del servicio en nuestra librería:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Service1" %>

Así mismo, el proyecto que contiene la librería para los servicios, tiene su propio fichero de configuración App.config, el cual no será necesario puesto que el que nos interesa es el Web.config que aparece en la aplicación WCF. Por tanto, también eliminamos el fichero App.config.

Configuración del servicio

A la hora de configurar el servicio podemos ver el que el fichero Web.config está muy bien comentado, lo cual permitirá guiarnos en la configuración. Sin embargo, vamos a utilizar una herramienta para editar la configuración y partiremos de cero para ir evolucionándola poco a poco. Sobre el fichero Web.config abrimos el menú contextual y abrimos el editor para la configuración de WCF. Si no aparece en el menú contextual (puede ocurrir si es la primera vez que se utiliza) podemos acceder a él desde el menú Tools.08-TipoDelServicio

Lo primero que vamos a hacer es crear un servicio nuevo y lo primero que nos va a pedir es que indiquemos el tipo del servicio. Mediante el explorador de ficheros accederemos a la carpeta de nuestra librería y accedemos a la .dll correspondiente (acuérdate de compilar previamente :)). Con ello seleccionamos la implementación del servicio y, en el siguiente paso, el contrato asociado.

Después escogemos el modo de comunicación, podemos elegir entre TCP, HTTP, Named Pipes, MSMQ o P2P. A nosotros el que nos interesa es HTTP, el cual es la opción por defecto pero cada uno debe mirar qué opción es la que más le interesa; en este enlace podéis encontrar más información al respecto. Después seleccionamos el método de interoperabilidad que, en nuestro caso, dado que utilizamos WCF, será Advanced Web Services interoperability y, de nuevo, dejamos la opción por defecto. Por último nos pide indicar la dirección para el endpoint que vamos a crear. Sin embargo, en lugar de ello, lo que vamos a hacer es darle una dirección base al host, de modo que dejamos en blanco la dirección (deberemos confirmarle que la queremos dejar en blanco) y cerramos el asistente.

Para indicar la dirección base para el host del servicio, desplegamos el servicio que acabamos de configurar y en el nodo Host especificamos la dirección base, en nuestro ejemplo: http://localhost/WcfServiceApplication/Service1.svc.

Los siguiente que haremos será crear un comportamiento asociado al servicio. Para ello, en la sección Advanced, creamos un nuevo Service Behavior y añadimos un elemento de tipo serviceMetadata. Hacemos doble clic sobre el elemento creado y ponemos el atributo HttpGetEnabled a true. Esto nos permitirá publicar los metadatos del servicio. Después seleccionamos el endpoint creado para nuestro servicio y le indicamos que su comportamiento asociado es el que acabamos de crear.

Una vez terminado con esto, el aspecto del Web.config debería ser algo así:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="serviceBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="serviceBehavior" name="WcfServiceLibrary.Service1">
                <endpoint binding="ws2007HttpBinding" contract="WcfServiceLibrary.IService1" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost/WcfServiceApplication/Service1.svc" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>

Configuración de IIS

Vamos a empezar con la configuración de IIS y para ello, lo primero que tenemos que hacer es decirle a la aplicación del servicio WCF que su hospedaje va a estar en IIS. Abrimos las propiedades del proyecto y seleccionamos la pestaña de Web y, en el apartado de Servers, cambiamos la selección a usar el servidor IIS local. Automáticamente nos pondrá la url asociada y lo único que queda por hacer es pulsar el botón para crear el directorio virtual.

Si abrimos Internet Information Services Manager podemos ver que se ha hospedado correctamente, al desplegar el árbol de sitios web nuestra aplicación (en mi caso WcfServiceApplication) debería aparecer ahí. Para comprobar que realmente nuestro servicio funciona podemos poner su dirección en el explorador (http://localhost/WcfServiceApplication/Service1.svc) y nos deberá mostrar un ventana como la siguiente:

10-Servicio

Hemos visto como crear un servicio WCF en IIS, pero no hemos acabado aún. La gracia de todo esto es que tengamos un cliente que consuma las operaciones que expone el servicio pero… eso lo dejaremos para otro post.