Tutorial: Hospedar y ejecutar un servicio Windows Communication Foundation básico

En este tutorial se describe la tercera de las cinco tareas necesarias para crear una aplicación Windows Communication Foundation (WCF) básica. Para obtener información general sobre los tutoriales, consulte Tutorial: Introducción a las aplicaciones Windows Communication Foundation.

La siguiente tarea para crear una aplicación WCF es hospedar un servicio WCF en una aplicación de consola. Un servicio WCF expone uno o más puntos de conexión, donde cada uno de ellos expone una o más operaciones de servicio. Un punto de conexión de servicio especifica la siguiente información:

  • Una dirección donde puede encontrar el servicio.
  • Un enlace que contiene la información que describe cómo debe comunicarse un cliente con el servicio.
  • Un contrato que define la funcionalidad que el servicio proporciona a sus clientes.

En este tutorial, aprenderá a:

  • Crear y configurar un proyecto de aplicación de consola para hospedar un servicio WCF.
  • Agregar código para hospedar el servicio WCF.
  • Actualizar el archivo de configuración.
  • Iniciar el servicio WCF y comprobar que se está ejecutando.

Crear y configurar un proyecto de aplicación de consola para hospedar el servicio

  1. Cree un proyecto de aplicación de consola en Visual Studio:

    1. En el menú Archivo, seleccione Abrir>Proyecto/Solución y vaya a la solución GettingStarted que creó anteriormente (GettingStarted.sln). seleccione Open(Abrir).

    2. En el menú Ver, seleccione Explorador de soluciones.

    3. En la ventana Explorador de soluciones, seleccione la solución GettingStarted (nodo superior) y, a continuación, seleccione Agregar>Nuevo proyecto en el menú contextual.

    4. En la ventana Agregar nuevo proyecto , en el lado izquierdo, seleccione la categoría Escritorio de Windows en Visual C# o Visual Basic.

    5. Seleccione la plantilla Aplicación de consola (.NET Framework) y escriba GettingStartedHost en el Nombre. Seleccione Aceptar.

  2. Agregue una referencia en el proyecto GettingStartedHost al proyecto GettingStartedLib:

    1. En la ventana Explorador de soluciones, seleccione la carpeta Referencias en el proyecto GettingStartedHost y, a continuación, seleccione Agregar referencia en el menú contextual.

    2. En el cuadro de diálogo Agregar referencia, en Proyectos en el lado izquierdo de la ventana, seleccione Solución.

    3. Seleccione GettingStartedLib en la sección central de la ventana y, a continuación, seleccione Aceptar.

      Esta acción hace que los tipos definidos en el proyecto GettingStartedLib estén disponibles para el proyecto GettingStartedHost.

  3. Agregue una referencia en el proyecto GettingStartedHost al ensamblado System.ServiceModel:

    1. En la ventana Explorador de soluciones, seleccione la carpeta Referencias en el proyecto GettingStartedHost y, a continuación, seleccione Agregar referencia en el menú contextual.

    2. En la ventana Agregar referencia, en Ensamblados en el lado izquierdo de la ventana, seleccione Marco.

    3. Seleccione System.ServiceModel y, a continuación, seleccione Aceptar.

    4. Guarde la solución seleccionando Archivo>Guardar todo.

Agregar código para hospedar el servicio

Para hospedar el servicio, agregue código para seguir los pasos enumerados a continuación:

  1. Cree un URI para la dirección base.
  2. Cree una instancia de clase para hospedar el servicio.
  3. Cree un punto de conexión de servicio.
  4. Habilitar el intercambio de metadatos
  5. Abra el host de servicios para escuchar los mensajes entrantes.

Realice los siguientes cambios en el código:

  1. Abra el archivo Program.cs o Module1.vb en el proyecto GettingStartedHost y reemplace su código por el código siguiente:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    Para obtener información sobre cómo funciona este código, consulte Pasos del programa de hospedaje de servicios.

  2. Actualice las propiedades del proyecto:

    1. En la ventana Explorador de soluciones, seleccione la carpeta GettingStartedHost y, a continuación, seleccione Propiedades en el menú contextual.

    2. En la página de propiedades GettingStartedHost, seleccione la pestaña Aplicación:

      • Para los proyectos de C#, seleccione GettingStartedHost.Program en la lista Objeto de inicio.

      • Para los proyectos de Visual Basic, seleccione Service.Program en la lista Objeto de inicio.

    3. En el menú Archivo, seleccione Guardar todo.

Comprobar si el servicio funciona

  1. Compile la solución y, a continuación, ejecute la aplicación de consola GettingStartedHost desde Visual Studio.

    El servicio se debe ejecutar con privilegios de administrador. Puesto que abrió Visual Studio con privilegios de administrador, al ejecutar GettingStartedHost en Visual Studio, la aplicación también se ejecuta con privilegios de administrador. Como alternativa, puede abrir un nuevo símbolo del sistema como administrador (seleccione Más>Ejecutar como administrador en el menú contextual) y ejecutar GettingStartedHost.exe dentro de él.

  2. Abra un explorador web y vaya a la página del servicio en http://localhost:8000/GettingStarted/.

    Nota

    Servicios como este requieren el permiso adecuado para registrar las direcciones HTTP en el equipo para la realización de escuchas. Las cuentas Administrador tienen este permiso, pero las cuentas de usuario no administrador deben tener concedido permiso para los espacios de nombres HTTP. Para obtener más información sobre cómo configurar las reservas de espacio de nombres, vea Configuración de HTTP y HTTPS.

Pasos del programa de hospedaje de servicios

Los pasos del código que agregó para hospedar el servicio se describen de la siguiente manera:

  • Paso 1: Cree una instancia de la clase Uri para contener la dirección base del servicio. Una dirección URL que contiene una dirección base tiene un URI opcional que identifica un servicio. La dirección base tiene el siguiente formato: <transport>://<machine-name or domain><:optional port #>/<optional URI segment>. La dirección base para el servicio de calculadora usa el transporte HTTP, localhost, el puerto 8000 y el segmento de URI, GettingStarted.

  • Paso 2: Cree una instancia de la clase ServiceHost, que usa para hospedar el servicio. El constructor toma dos parámetros: el tipo de la clase que implementa el contrato de servicio y la dirección base del servicio.

  • Paso 3: Cree una instancia de ServiceEndpoint. Un extremo de servicio consta de una dirección, un enlace y un contrato de servicio. El constructor ServiceEndpoint toma el tipo de interfaz del contrato de servicio, un enlace y una dirección. El contrato de servicio es ICalculator, que se define e implemente en el tipo de servicio. El enlace para este ejemplo es WSHttpBinding, que es un enlace integrado y se conecta a puntos de conexión que son conformes a las especificaciones de WS-*. Para obtener más información sobre los enlaces de WCF, consulte Información general de enlaces de WCF. Anexe la dirección a la dirección base para identificar el punto de conexión. El código especifica la dirección como CalculatorService y la dirección completa del punto de conexión como http://localhost:8000/GettingStarted/CalculatorService.

    Importante

    Para .NET Framework versión 4 y versiones posteriores, agregar un punto de conexión de servicio es opcional. En estas versiones, si no agrega el código o la configuración, WCF agrega un punto de conexión predeterminado para cada combinación de dirección base y contrato implementada por el servicio. Para obtener más información sobre los puntos de conexión predeterminados, consulte Especificación de una dirección de punto de conexión. Para obtener más información sobre los puntos de conexión, enlaces y comportamientos predeterminados, consulte Configuración simplificada y Configuración simplificada de los servicios WCF.

  • Paso 4: Habilite el intercambio de metadatos. Los clientes usan intercambio de metadatos para generar los servidores proxy para llamar a las operaciones de servicio. Para habilitar el intercambio de metadatos, cree una instancia de ServiceMetadataBehavior, establezca su propiedad HttpGetEnabled en true y agregue el objeto ServiceMetadataBehavior a la colección Behaviors de la instancia de ServiceHost.

  • Paso 5: Abra ServiceHost para escuchar los mensajes entrantes. La aplicación espera a que presione Entrar. Una vez que la aplicación crea una instancia de ServiceHost, ejecuta un bloque try/catch. Para obtener más información sobre la detección segura de excepciones producidas por ServiceHost, consulte Uso de Close y Abort para liberar los recursos del cliente WCF.

Importante

Al agregar una biblioteca de servicios WCF, Visual Studio la hospeda automáticamente si la depura iniciando un host de servicio. Para evitar conflictos, puede impedir que Visual Studio hospede la biblioteca de servicios WCF.

  1. Seleccione el proyecto GettingStartedLib en el Explorador de soluciones y elija Propiedades en el menú contextual.
  2. Seleccione Opciones de WCF y desactive Iniciar el host de servicio de WCF al depurar otro proyecto de la misma solución.

Pasos siguientes

En este tutorial, ha aprendido a:

  • Crear y configurar un proyecto de aplicación de consola para hospedar un servicio WCF.
  • Agregar código para hospedar el servicio WCF.
  • Actualizar el archivo de configuración.
  • Iniciar el servicio WCF y comprobar que se está ejecutando.

Pase al tutorial siguiente para obtener información sobre cómo crear un cliente WCF.