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.

11 comentarios sobre “Servicios WCF hospedados en IIS (I)”

  1. Excelente Cris! Tu post esta genial, estoy seguro de que será de referencia para mucha gente que tenga problemas a la hora de mover sus servicios WCF de su ‘HostConsole’ a IIS 🙂

    Ya tengo ganas de leer la siguiente parte de la serie!!

  2. Ya era hora de leerte por aquí Cris. 🙂

    Ahora que has empezado a abrir el melón, no nos puedes dejar en vilo… a ver si no decaen esas ganas de seguir así. 🙂

  3. Gracias a todos 🙂 Me alegro de que os haya parecido interesante el post.
    Jorge, la verdad es que sí, ya era hora!! :). Yo también espero que no decaigan las ganas de seguir, por lo pronto, tengo que continuar con las siguiente parte 🙂
    Un abrazote a todos!

  4. con respecto al titulo del post creo que deberia explicar mejor como se hace el hospedaje en IIS, en que versiones funciona, las configuraciones WCF que acepta cada version del IIS. porque IIS 5 y 6 solo acepten ciertas configuraciones de WCF

  5. Tu post esta muy bien, me lo ha recomendado Ivan.

    Pero tengo un problemilla.
    He echo lo que dices y en local me funciona muy bien, mi problema viene al intentar consumir el servicio desde un cliente que esta en remoto.

    Yo he publicado el servicio en el IIS y desde fuera de la red puedo acceder al servicio, pero cuando intento agregar una referencia a ese servicio desde el VS2008, me da un error:

    Los metadatos contienen una referencia que no se puede resolver: ‘http://web1.hispanitasdom.local/HispanitasRetail/Service1.svc?wsdl’.

    la direccion a la que apuntan los metadatos es la de mi servidor en local, (web1). ¿Como podria cambiar arreglar esto?.

    Gracias por vuestra ayuda.

  6. Esta muy bueno el Post, pero yo tengo muchas dudas. Es necesario usar crear WCF library? si de frente lo puedo hacer en el WCF Application. Yo tengo proyecto que tengo mi Capa de Dato Luego una de Logica, y Luego Mi WCF library, la cual se comunica con mi Logica. mi preguna es si mi logica lo puedo publicar en una WCF Application sin pasar por el WCF Library?

  7. Muy bueno el post, tengo una duda.. si el IIS esta ubicado en un server que al cual no tengo permisos desde mi maquina, como configuro el servicio en el IIS..
    Gracias.

Responder a jorge Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *