Tag Archives: Windows Process Activation Services (WAS)

Alojar un servicio Windows Communication Foundation en Windows 7 utilizando Windows Process Activation Services (WAS)

0
Filed under .NET Development, Windows Communication Foundation (WCF)

Existe un error (o al menos existió al momento de escribir este artículo). Si alojamos el servicio en "Windows Process Activation Services" utilizando el protocolo "net.tcp" y el nombre del equipo contiene caracteres no-ASCII, no seremos capaces de establecer la conexión con el servicio.

Para poner en funcionamiento un servicio “Windows Communication Foundation (WCF)” hay que alojarlo. Podemos alojar los servicios en:
- Aplicaciones Windows Forms/WPF
- Aplicaciones consola
- Servicios de Windows
- Internet Information Services
- Windows Process Activation Services (WAS)

“Windows Process Activation Services” no es nuevo. De hecho fue introducido por primera vez en “Windows Vista”, está presente en “Windows Server 2008″ y continúa en “Windows 7″.
“Windows Process Activation Services” puede ser una buena opción si pensamos en correr servicios “Windows Communication Foundation” en dichos sistemas operativos.

Crear el servicio “Windows Communication Foundation”
1 – Abrimos “Visual Studio” y elegimos crear un proyecto de tipo “WCF Service Library”. De nombre le ponemos “ServicioHolaMundo”. Una vez creado el proyecto, borramos los archivos “IService1.cs” y “Service1.cs” que “Visual Studio” crea por defecto.

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


2 – Tenemos que crear un contrato (interfaz). Para esto, en el explorador de solución hacemos clic derecho sobre “ServicioHolaMundo” y elegimos “Add” -> “New Item…”. Una vez abierto “Add New Item” elegimos “Interface” y de nombre le ponemos “IServicioHolaMundo.cs”. Hacemos clic en “Add”.

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


3 – Dejamos la interfaz así:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace NicolasFerreira.Servicios
{
    [ServiceContract(Name = "ServicioHolaMundo",
    Namespace = "http://nicolasferreira.com/2009/01/09")]
    public interface IServicioHolaMundo
    {
        [OperationContract()]
        string HolaMundo();
    }
}

4 – Tenemos que crear una clase (la implementación del contrato) que implemente la interfaz “IServicioHolaMundo”. Para esto, en el explorador de solución hacemos clic derecho sobre “ServicioHolaMundo” y elegimos “Add” -> “New Item…”. Una vez abierto “Add New Item” elegimos “Class” y de nombre le ponemos “ServicioHolaMundo.cs”. Hacemos clic en “Add”.

[Haga clic en la imagen para ampliar]


5 – Dejamos la clase así:

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

namespace NicolasFerreira.Servicios
{
    public class ServicioHolaMundo : IServicioHolaMundo
    {
        #region IServicioHolaMundo Members

        public string HolaMundo()
        {
            return "¡Hola mundo!";
        }

        #endregion
    }
}

6 – En el explorador de solución y bajo el proyecto “ServicioHolaMundo” buscamos el archivo “App.config”. Hacemos clic derecho sobre él y elegimos la opción “Edit WCF configuration”. Aparecerá la aplicación “Microsoft Service Configuration Editor”. En el panel “Configuration” bajo la carpeta “Services” seleccionamos “ServicioHolaMundo.Service1″. Cambiamos el valor de la propiedad “Name” por “NicolasFerreira.Servicios.ServicioHolaMundo”.

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


7 – Expandir las siguientes carpetas: “NicolasFerreira.Servicios.ServicioHolaMundo” -> “Endpoints” hasta ver dos “Endpoints” que no tienen nombre: “(Empty Name)”. Hacemos clic sobre el primero. Podemos ver que el valor de la propiedad “Binding” es “wsHttpBinding”. Lo cambiamos a “netTcpBinding”. El valor de la propiedad “Contract” es “ServicioHolaMundo.IService1″. Lo cambiamos a “NicolasFerreira.Servicios.IServicioHolaMundo”. Ahora hacemos clic sobre el segundo “Endpoint”. Podemos ver que el valor de la propiedad “Binding” es “mexHttpBinding”. Lo cambiamos a “mexTcpBinding”.

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


8 – Expandir las siguientes carpetas: “Advanced” -> “Service Behaviors” -> “ServicioHolaMundo.Service1Behavior” hasta ver “serviceMetadata”. Seleccionamos “serviceMetadata” y cambiamos el valor de la propiedad “HttpGetEnabled” a “False”.

[Haga clic en la imagen para ampliar]


9 – Cerramos la aplicación y cuando nos pregunte si queremos guardar los cambios le decimos que sí.
10 – Por último agregamos un archivo llamado “ServicioHolaMundo.svc” al proyecto.

[Haga clic en la imagen para ampliar]


11 – Lo dejamos así:

<%@ ServiceHost Language="C#" Service="NicolasFerreira.Servicios.ServicioHolaMundo" %>

12 – Compilamos la solución y cerramos “Visual Studio”.

[Haga clic en la imagen para ampliar]


Instalar y configurar “Windows Process Activation Services” para alojar el servicio
1 – En "Windows 7" vamos a "Control Panel". Una vez que estemos ahí, hacemos clic sobre el vínculo "Programs" y después bajo "Programs and Features" hacemos clic en el vínculo "Turn Windows features on or off". Cuando aparezca el cuadro "Windows Features" marcamos las siguientes opciones:
- "IIS Management Console" que se encuentra en: "Internet Information Services" -> "Web Management Tools".
- ".NET Extensibility" que se encuentra en: "Internet Information Services" -> "World Wide Web Services" -> "Application Development Features".
- "Windows Communication Foundation Non-HTTP Activation" que se encuentra en: "Microsoft .NET Framework 3.5.1"
Finalmente hacemos clic en "OK".

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


2 – Volvemos a “Control Panel” pero esta vez hacemos clic sobre el vínculo “All Control Panel Items” para así poder ir a “Administrative Tools” y elegir “Internet Information Services (IIS) Manager”.

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


3 – Por defecto en “Windows 7″ ya vienen configurados algunos “Bindings” para el sitio “Default Web Site”. Esto lo comprobamos expandiendo el nombre del equipo, luego “Sites” y luego eligiendo “Default Web Site”. Si hacemos clic en “Bindings…” veremos lo siguiente:

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


4 – Para este ejemplo utilizaremos la configuración por defecto (el protocolo “net.tcp” y el puerto “808″).
5 – Hacemos clic derecho sobre "Default Web Site" y seleccionamos la opción "Add Application…". En "Alias" escribimos "ServicioHolaMundo" y en "Physical path" escribimos "C:\inetpub\wwwroot\ServicioHolaMundo" (previamente hay que crear la carpeta "ServicioHolaMundo" en "C:\inetpub\wwwroot"). Hacemos clic en "OK".

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


6 – Una vez que hicimos clic en "OK", quedará seleccionada la aplicacion que acabamos de crear. En el panel "Actions" hacemos clic en la opción "Advanced Settings…". Aparecerá el cuadro "Advanced Settings". El valor de la propiedad "Enabled Protocols" es "http". Lo cambiamos por "net.tcp", hacemos clic en "OK" y cerramos "Internet Information Services (IIS) Manager".

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


7 – Vamos a la carpeta "C:\inetpub\wwwroot\ServicioHolaMundo" y pegamos los archivos "ServicioHolaMundo.svc" y "app.config". Renombramos el archivo "app.config" por "Web.config". Creamos una carpeta con el nombre de "Bin" y le pegamos el archivo "ServicioHolaMundo.dll".

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]


Probar el servicio
1 – Podemos probar lo que hemos hecho yendo a Visual Studio, creando un proyecto de tipo aplicación consola y agregando una referencia al servicio.

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]

[Haga clic en la imagen para ampliar]

Won’t you pour me a Cuban breeze Gretchen